CRUD 작업
이 페이지의 내용
CRUD 작업은 문서를 만들고, 읽고, 업데이트 하고, 삭제 합니다. MongoDB PHP MongoDB\Collection
라이브러리의 클래스는 MongoDB의 크로스 드라이버 CRUD 사양 을 구현합니다. MongoDB에서 문서를 삽입, 찾기, 업데이트 및 삭제하는 메서드에 대한 액세스를 제공합니다.
이 문서는 MongoDB PHP 라이브러리를 사용하여 문서를 삽입, 쿼리, 업데이트 및 삭제하는 방법에 대한 일반적인 설명을 제공합니다. MongoDB 매뉴얼의 CRUD 섹션은 MongoDB를 사용한 CRUD 작업에 대해 보다 자세한 설명을 제공합니다.
문서 삽입
문서 하나 삽입
MongoDB\Collection::insertOne()
메서드는 MongoDB에 문서 하나를 삽입하고 MongoDB\InsertOneResult
인스턴스를 반환하며, 이 인스턴스를 사용하여 삽입된 문서의 ID에 액세스할 수 있습니다.
다음 작업은 test
데이터베이스의 users
컬렉션에 문서를 삽입합니다.
$collection = (new MongoDB\Client)->test->users; $insertOneResult = $collection->insertOne([ 'username' => 'admin', 'email' => 'admin@example.com', 'name' => 'Admin User', ]); printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount()); var_dump($insertOneResult->getInsertedId());
이 경우 출력은 다음과 유사합니다:
Inserted 1 document(s) object(MongoDB\BSON\ObjectId)#11 (1) { ["oid"]=> string(24) "579a25921f417dd1e5518141" }
출력에는 삽입된 문서의 ID가 포함됩니다.
문서를 삽입할 때 _id
값을 포함하면 MongoDB는 _id
값이 컬렉션 내에서 고유한지 확인합니다. _id
값이 고유하지 않으면 중복 키 오류로 인해 삽입 작업이 실패합니다.
다음 예제는 _id
의 값을 지정하면서 문서를 삽입합니다:
$collection = (new MongoDB\Client)->test->users; $insertOneResult = $collection->insertOne(['_id' => 1, 'name' => 'Alice']); printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount()); var_dump($insertOneResult->getInsertedId());
이 경우 출력은 다음과 유사합니다:
Inserted 1 document(s) int(1)
팁
다음도 참조하세요.
다수 문서 삽입
MongoDB\Collection::insertMany()
메서드를 사용하면 한 번의 쓰기 작업으로 여러 문서를 삽입할 수 있으며 삽입된 문서의 ID에 액세스하는 데 사용할 수 있는 MongoDB\InsertManyResult
의 인스턴스를 반환합니다.
다음 작업은 test
데이터베이스의 users
컬렉션에 두 개의 문서를 삽입합니다.
$collection = (new MongoDB\Client)->test->users; $insertManyResult = $collection->insertMany([ [ 'username' => 'admin', 'email' => 'admin@example.com', 'name' => 'Admin User', ], [ 'username' => 'test', 'email' => 'test@example.com', 'name' => 'Test User', ], ]); printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount()); var_dump($insertManyResult->getInsertedIds());
이 경우 출력은 다음과 유사합니다:
Inserted 2 document(s) array(2) { [0]=> object(MongoDB\BSON\ObjectId)#11 (1) { ["oid"]=> string(24) "579a25921f417dd1e5518141" } [1]=> object(MongoDB\BSON\ObjectId)#12 (1) { ["oid"]=> string(24) "579a25921f417dd1e5518142" } }
팁
다음도 참조하세요.
문서 쿼리
MongoDB PHP 라이브러리는 문서 쿼리를 위한 MongoDB\Collection::findOne()
및 MongoDB\Collection::find()
메서드와 애그리게이션 작업을 수행하기 위한 MongoDB\Collection::aggregate()
메서드를 제공 합니다.
쿼리 기준을 평가할 때 MongoDB는 BSON types에 대한 자체 비교 규칙 에 따라 유형과 값을 비교하며, 이는 PHP의 비교 와는 다릅니다. 및 유형 저글링 규칙. 특수 BSON 유형과 일치하는 경우 쿼리 기준은 해당 BSON 클래스 를 사용해야 합니다. 확장 프로그램에서 (예: MongoDB\BSON\ObjectId 사용 ObjectId 와 일치시킵니다.
하나의 문서 찾기
MongoDB\Collection::findOne()
은 쿼리와 일치하는 첫 번째 문서를 반환하고 쿼리와 일치하는 문서가 없는 경우 null
을 반환합니다.
다음 예에서는 "94301"
의 _id
를 사용하여 문서를 검색합니다.
$collection = (new MongoDB\Client)->test->zips; $document = $collection->findOne(['_id' => '94301']); var_dump($document);
이 경우 출력은 다음과 유사합니다:
object(MongoDB\Model\BSONDocument)#13 (1) { ["storage":"ArrayObject":private]=> array(5) { ["_id"]=> string(5) "94301" ["city"]=> string(9) "PALO ALTO" ["loc"]=> object(MongoDB\Model\BSONArray)#12 (1) { ["storage":"ArrayObject":private]=> array(2) { [0]=> float(-122.149685) [1]=> float(37.444324) } } ["pop"]=> int(15965) ["state"]=> string(2) "CA" } }
참고
이 예시의 기준은 _id
와 string 값 "94301"
을 일치시켰습니다. 동일한 기준은 MongoDB의 BSON types 비교 규칙 으로 인해 정수 값이 94301
인 문서와 일치하지 않습니다. 마찬가지로 사용자는 MongoDB\BSON\ObjectId 문자열과 ObjectId는 직접 비교할 수 없기 때문에 를 ObjectId 값과 일치시킬 때 객체입니다. _id
팁
다음도 참조하세요.
다수 문서 찾기
MongoDB\Collection::find()
는 MongoDB\Driver\Cursor 를 반환합니다. 객체를 반복하여 일치하는 모든 문서에 액세스할 수 있습니다.
다음 예에서는 지정된 도시 및 주 값이 있는 zips
컬렉션의 문서를 나열합니다.
$collection = (new MongoDB\Client)->test->zips; $cursor = $collection->find(['city' => 'JERSEY CITY', 'state' => 'NJ']); foreach ($cursor as $document) { echo $document['_id'], "\n"; }
출력은 다음과 유사합니다:
07302 07304 07305 07306 07307 07310
팁
다음도 참조하세요.
쿼리 프로젝션
기본적으로 MongoDB의 쿼리는 일치하는 문서의 모든 필드를 반환합니다. MongoDB가 애플리케이션으로 전송하는 데이터의 양을 제한하기 위해 쿼리 작업에 프로젝션 문서 를 포함할 수 있습니다.
참고
MongoDB는 프로젝션 문서에서 명시적으로 제외하지 않는 한 기본적으로 _id
필드를 포함합니다.
다음 예에서는 cuisine
및 borough
필드를 기반으로 레스토랑을 찾고 프로젝션 을 사용하여 반환되는 필드를 제한합니다. 또한 결과를 5 문서로 제한합니다.
$collection = (new MongoDB\Client)->test->restaurants; $cursor = $collection->find( [ 'cuisine' => 'Italian', 'borough' => 'Manhattan', ], [ 'projection' => [ 'name' => 1, 'borough' => 1, 'cuisine' => 1, ], 'limit' => 4, ] ); foreach($cursor as $restaurant) { var_dump($restaurant); };
이 경우 출력은 다음과 유사합니다:
object(MongoDB\Model\BSONDocument)#10 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#8 (1) { ["oid"]=> string(24) "576023c6b02fa9281da3f983" } ["borough"]=> string(9) "Manhattan" ["cuisine"]=> string(7) "Italian" ["name"]=> string(23) "Isle Of Capri Resturant" } } object(MongoDB\Model\BSONDocument)#13 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#12 (1) { ["oid"]=> string(24) "576023c6b02fa9281da3f98d" } ["borough"]=> string(9) "Manhattan" ["cuisine"]=> string(7) "Italian" ["name"]=> string(18) "Marchis Restaurant" } } object(MongoDB\Model\BSONDocument)#8 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#10 (1) { ["oid"]=> string(24) "576023c6b02fa9281da3f99b" } ["borough"]=> string(9) "Manhattan" ["cuisine"]=> string(7) "Italian" ["name"]=> string(19) "Forlinis Restaurant" } } object(MongoDB\Model\BSONDocument)#12 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#13 (1) { ["oid"]=> string(24) "576023c6b02fa9281da3f9a8" } ["borough"]=> string(9) "Manhattan" ["cuisine"]=> string(7) "Italian" ["name"]=> string(22) "Angelo Of Mulberry St." } }
제한, 정렬 및 건너뛰기 옵션
프로젝션 기준 외에도 쿼리 중에 문서를 제한, 정렬, 건너뛰는 옵션을 지정할 수 있습니다.
다음 예에서는 limit
및 sort
옵션을 사용하여 미국에서 가장 인구가 많은 5개의 우편번호를 쿼리합니다.
$collection = (new MongoDB\Client)->test->zips; $cursor = $collection->find( [], [ 'limit' => 5, 'sort' => ['pop' => -1], ] ); foreach ($cursor as $document) { printf("%s: %s, %s\n", $document['_id'], $document['city'], $document['state']); }
이 경우 출력은 다음과 유사합니다:
60623: CHICAGO, IL 11226: BROOKLYN, NY 10021: NEW YORK, NY 10025: NEW YORK, NY 90201: BELL GARDENS, CA
정규 표현식
필터 기준에는 MongoDB\BSON\Regex 클래스 디렉토리 또는 $regex
연산자.
다음 예제에서는 zips
컬렉션에 있는 문서 중 도시 이름이 'garden'으로 시작하고 주가 텍사스인 문서를 나열합니다:
$collection = (new MongoDB\Client)->test->zips; $cursor = $collection->find([ 'city' => new MongoDB\BSON\Regex('^garden', 'i'), 'state' => 'TX', ]); foreach ($cursor as $document) { printf("%s: %s, %s\n", $document['_id'], $document['city'], $document['state']); }
이 경우 출력은 다음과 유사합니다:
78266: GARDEN RIDGE, TX 79739: GARDEN CITY, TX 79758: GARDENDALE, TX
$regex
연산자를 사용하여 동등한 필터를 만들 수 있습니다:
[ 'city' => ['$regex' => '^garden', '$options' => 'i'], 'state' => 'TX', ]
팁
다음도 참조하세요.
MongoDB 매뉴얼의 $regex
MongoDB의 정규식 구문은 PHP의 PCRE 구문과 정확히 동일하지는 않지만 preg_quote()를 사용하여 있는 그대로 일치시켜야 하는 특수 문자를 이스케이프 처리할 수 있습니다. 다음 예는 이름이 '(Library)'로 시작하는 레스토랑을 찾습니다:
$collection = (new MongoDB\Client)->test->restaurants; $cursor = $collection->find([ 'name' => new MongoDB\BSON\Regex('^' . preg_quote('(Library)')), ]);
애그리게이션이 포함된 복합 쿼리
MongoDB의 애그리게이션 프레임워크 를 사용하면 컬렉션 데이터를 필터링, 변환 및 그룹화하는 복잡한 쿼리를 실행할 수 있습니다. MongoDB 객체를 반복하여 애그리게이션 작업의 결과에 액세스할 수 있습니다. 메서드의 출력에 대한 자세한 내용은 MongoDB\Collection::aggregate()
메서드의 동작 참조 를 참조하세요.
다음 예에서는 우편번호가 가장 많은 미국 5개 주를 나열합니다.
$collection = (new MongoDB\Client)->test->zips; $cursor = $collection->aggregate([ ['$group' => ['_id' => '$state', 'count' => ['$sum' => 1]]], ['$sort' => ['count' => -1]], ['$limit' => 5], ]); foreach ($cursor as $state) { printf("%s has %d zip codes\n", $state['_id'], $state['count']); }
이 경우 출력은 다음과 유사합니다:
TX has 1671 zip codes NY has 1595 zip codes CA has 1516 zip codes PA has 1458 zip codes IL has 1237 zip codes
팁
다음도 참조하세요.
문서 업데이트
하나의 문서 업데이트
필터와 일치하는 단일 문서를 업데이트하려면 MongoDB\Collection::updateOne()
메서드를 사용합니다. MongoDB\Collection::updateOne()
은 MongoDB\UpdateResult
객체를 반환하며, 이 객체를 사용하여 업데이트 작업에 대한 통계에 액세스할 수 있습니다.
업데이트 메서드에는 두 가지 필수 매개 변수가 있습니다. 하나는 업데이트할 문서를 식별하는 쿼리 필터이고 다른 하나는 수행할 업데이트를 지정하는 업데이트 문서입니다. MongoDB\Collection::updateOne()
참조에서는 각 매개 변수에 대해 자세히 설명합니다.
다음 예제에서는 MongoDB\Collection::insertOne()
메서드를 사용하여 test
데이터베이스의 빈 users
컬렉션에 두 개의 문서를 삽입한 다음 state
필드 값이 "ny"
인 문서를 "us"
로 설정된 country
필드를 포함하도록 업데이트합니다.
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny']); $collection->insertOne(['name' => 'Alice', 'state' => 'ny']); $updateResult = $collection->updateOne( ['state' => 'ny'], ['$set' => ['country' => 'us']] ); printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
업데이트 작업에서는 첫 번째 문서를 필터 기준과 일치하도록 업데이트하는 MongoDB\Collection::updateOne()
메서드를 사용하므로 결과는 다음과 비슷합니다:
Matched 1 document(s) Modified 1 document(s)
다음 예와 같이 업데이트가 필드 값을 기존 값으로 설정하는 경우 등 문서가 필터와 일치하지만 업데이트에 의해 수정되지는 않을 수 있습니다.
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny']); $updateResult = $collection->updateOne( ['name' => 'Bob'], ['$set' => ['state' => 'ny']] ); printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
따라서 일치하는 문서 수와 수정된 문서 수는 같지 않으며 작업 결과는 다음과 같습니다.
Matched 1 document(s) Modified 0 document(s)
다수 문서 업데이트
MongoDB\Collection::updateMany()
가 필터 기준과 일치하는 문서를 하나 이상 업데이트하고 MongoDB\UpdateResult
객체를 반환하며, 이 객체를 사용하여 업데이트 작업에 대한 통계에 액세스할 수 있습니다.
업데이트 메서드에는 두 가지 필수 매개 변수가 있습니다. 하나는 업데이트할 문서를 식별하는 쿼리 필터이고 다른 하나는 수행할 업데이트를 지정하는 업데이트 문서입니다. MongoDB\Collection::updateMany()
참조에서는 각 매개 변수에 대해 자세히 설명합니다.
다음 예에서는 test
데이터베이스의 빈 users
컬렉션에 세 개의 문서를 삽입한 다음 $set
연산자를 사용하여 값이 "us"
인 country
필드를 포함하도록 필터 기준과 일치하는 문서를 업데이트합니다.
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny', 'country' => 'us']); $collection->insertOne(['name' => 'Alice', 'state' => 'ny']); $collection->insertOne(['name' => 'Sam', 'state' => 'ny']); $updateResult = $collection->updateMany( ['state' => 'ny'], ['$set' => ['country' => 'us']] ); printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
필드 값을 현재 값으로 설정하는 등 업데이트 작업 후에도 문서가 변경되지 않는 경우 수정된 문서 수가 일치하는 문서 수보다 적을 수 있습니다. "Bob"
의 name
이 포함된 업데이트 문서로 인해 문서가 변경되지 않으므로 작업 출력은 다음과 유사합니다.
Matched 3 document(s) Modified 2 document(s)
팁
다음도 참조하세요.
문서 교체
대체 작업은 업데이트 작업과 비슷하지만 새 필드나 새 필드 값을 포함하도록 문서를 업데이트하는 대신 전체 문서를 새 문서로 대체하며 원본 문서의 _id
값을 유지합니다.
MongoDB\Collection::replaceOne()
메서드는 필터 기준과 일치하는 단일 문서를 대체하고, 대체 작업에 대한 통계에 액세스하는 데 사용할 수 있는 MongoDB\UpdateResult
의 인스턴스를 반환합니다.
MongoDB\Collection::replaceOne()
에는 두 개의 필수 매개 변수가 있습니다. 하나는 대체할 문서를 식별하는 쿼리 필터이고, 다른 하나는 MongoDB에서 원본 문서를 대체할 대체 문서입니다. MongoDB\Collection::replaceOne()
참조에서는 각 매개 변수에 대해 자세히 설명합니다.
중요
대체 작업은 _id
값을 제외한 문서의 모든 필드를 대체합니다. 원하는 필드를 실수로 덮어쓰거나 삭제하지 않으려면 MongoDB\Collection::updateOne()
또는 MongoDB\Collection::updateMany()
메서드를 사용하여 문서 전체를 대체하는 대신 문서에서 개별 필드를 업데이트하세요.
다음 예제에서는 test
데이터베이스의 빈 users
컬렉션에 문서 하나를 삽입한 다음 해당 문서를 새 것으로 바꿉니다:
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny']); $updateResult = $collection->replaceOne( ['name' => 'Bob'], ['name' => 'Robert', 'state' => 'ca'] ); printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
이 경우 출력은 다음과 유사합니다:
Matched 1 document(s) Modified 1 document(s)
업서트
업데이트 및 바꾸기 작업은 업서트 옵션을 지원합니다. upsert
이(가) true
이고 지정된 필터와 일치하는 문서가 없는 경우 작업은 새 문서를 만들어 삽입합니다. 일치하는 문서가 있는 경우 작업 은 일치하는 문서를 수정하거나 대체합니다.
문서가 업서트되면 MongoDB\UpdateResult::getUpsertedId()
를 통해 해당 ID에 액세스할 수 있습니다.
다음 예제에서는 upsert
옵션이 true
로 설정되어 있고 test
데이터베이스에 빈 users
컬렉션이 있는 MongoDB\Collection::updateOne()
을 사용하여 문서를 데이터베이스에 삽입합니다:
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $updateResult = $collection->updateOne( ['name' => 'Bob'], ['$set' => ['state' => 'ny']], ['upsert' => true] ); printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); printf("Modified %d document(s)\n", $updateResult->getModifiedCount()); printf("Upserted %d document(s)\n", $updateResult->getUpsertedCount()); $upsertedDocument = $collection->findOne([ '_id' => $updateResult->getUpsertedId(), ]); var_dump($upsertedDocument);
이 경우 출력은 다음과 유사합니다:
Matched 0 document(s) Modified 0 document(s) Upserted 1 document(s) object(MongoDB\Model\BSONDocument)#16 (1) { ["storage":"ArrayObject":private]=> array(3) { ["_id"]=> object(MongoDB\BSON\ObjectId)#15 (1) { ["oid"]=> string(24) "57509c4406d7241dad86e7c3" } ["name"]=> string(3) "Bob" ["state"]=> string(2) "ny" } }
문서 삭제
문서 하나 삭제
MongoDB\Collection::deleteOne()
메서드는 필터 기준과 일치하는 단일 문서를 삭제하고 삭제 작업에 대한 통계에 액세스하는 데 사용할 수 있는 MongoDB\DeleteResult
를 반환합니다.
필터 기준과 일치하는 문서가 여러 개 있는 경우 MongoDB\Collection::deleteOne()
은 가장 먼저 일치하는 문서를 삭제합니다.
MongoDB\Collection::deleteOne()
에는 필수 매개 변수가 하나 있습니다. 이는 삭제할 문서를 지정하는 쿼리 필터입니다. 전체 메서드 문서는 MongoDB\Collection::deleteOne()
참조를 확인하세요.
다음 작업은 state
필드의 값이 "ny"
인 첫 번째 문서를 삭제합니다.
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny']); $collection->insertOne(['name' => 'Alice', 'state' => 'ny']); $deleteResult = $collection->deleteOne(['state' => 'ny']); printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
이 경우 출력은 다음과 유사합니다:
Deleted 1 document(s)
팁
다음도 참조하세요.
복수의 문서 삭제
MongoDB\Collection::deleteMany()
는 필터 조건과 일치하는 모든 문서를 삭제하고 삭제 작업에 대한 통계에 액세스하는 데 사용할 수 있는 MongoDB\DeleteResult
를 반환합니다.
MongoDB\Collection::deleteMany()
에는 필수 매개 변수가 하나 있습니다. 이는 삭제할 문서를 지정하는 쿼리 필터입니다. 전체 메서드 문서는 MongoDB\Collection::deleteMany()
참조를 확인하세요.
다음 작업은 state
필드 값이 "ny"
인 모든 문서를 삭제합니다.
$collection = (new MongoDB\Client)->test->users; $collection->drop(); $collection->insertOne(['name' => 'Bob', 'state' => 'ny']); $collection->insertOne(['name' => 'Alice', 'state' => 'ny']); $deleteResult = $collection->deleteMany(['state' => 'ny']); printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
이 경우 출력은 다음과 유사합니다:
Deleted 2 document(s)