문서 메뉴
문서 홈
/ / /
PHP 라이브러리 매뉴얼
/

CRUD 작업

이 페이지의 내용

  • 문서 삽입
  • 문서 하나 삽입
  • 다수 문서 삽입
  • 문서 쿼리
  • 하나의 문서 찾기
  • 다수 문서 찾기
  • 쿼리 프로젝션
  • 제한, 정렬 및 건너뛰기 옵션
  • 정규 표현식
  • 애그리게이션이 포함된 복합 쿼리
  • 문서 업데이트
  • 하나의 문서 업데이트
  • 다수 문서 업데이트
  • 문서 교체
  • 업서트
  • 문서 삭제
  • 문서 하나 삭제
  • 복수의 문서 삭제

CRUD 작업은 문서를 만들고, 읽고, 업데이트 하고, 삭제 합니다. MongoDB PHP MongoDB\Collection 라이브러리의 클래스는 MongoDB의 크로스 드라이버 CRUD 사양 을 구현합니다. MongoDB에서 문서를 삽입, 찾기, 업데이트 및 삭제하는 메서드에 대한 액세스를 제공합니다.

이 문서는 MongoDB PHP 라이브러리를 사용하여 문서를 삽입, 쿼리, 업데이트 및 삭제하는 방법에 대한 일반적인 설명을 제공합니다. MongoDB 매뉴얼의 CRUD 섹션은 MongoDB를 사용한 CRUD 작업에 대해 보다 자세한 설명을 제공합니다.

MongoDB\Collection::insertOne() 메서드는 MongoDB에 문서 하나를 삽입하고 MongoDB\InsertOneResult 인스턴스를 반환하며, 이 인스턴스를 사용하여 삽입된 문서의 ID에 액세스할 수 있습니다.

다음 작업은 test 데이터베이스의 users 컬렉션에 문서를 삽입합니다.

<?php
$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의 값을 지정하면서 문서를 삽입합니다:

<?php
$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 컬렉션에 두 개의 문서를 삽입합니다.

<?php
$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를 사용하여 문서를 검색합니다.

<?php
$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 컬렉션의 문서를 나열합니다.

<?php
$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 필드를 포함합니다.

다음 예에서는 cuisineborough 필드를 기반으로 레스토랑을 찾고 프로젝션 을 사용하여 반환되는 필드를 제한합니다. 또한 결과를 5 문서로 제한합니다.

<?php
$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."
}
}

프로젝션 기준 외에도 쿼리 중에 문서를 제한, 정렬, 건너뛰는 옵션을 지정할 수 있습니다.

다음 예에서는 limitsort 옵션을 사용하여 미국에서 가장 인구가 많은 5개의 우편번호를 쿼리합니다.

<?php
$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'으로 시작하고 주가 텍사스인 문서를 나열합니다:

<?php
$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 연산자를 사용하여 동등한 필터를 만들 수 있습니다:

<?php
[
'city' => ['$regex' => '^garden', '$options' => 'i'],
'state' => 'TX',
]

다음도 참조하세요.

MongoDB 매뉴얼의 $regex

MongoDB의 정규식 구문은 PHP의 PCRE 구문과 정확히 동일하지는 않지만 preg_quote()를 사용하여 있는 그대로 일치시켜야 하는 특수 문자를 이스케이프 처리할 수 있습니다. 다음 예는 이름이 '(Library)'로 시작하는 레스토랑을 찾습니다:

<?php
$collection = (new MongoDB\Client)->test->restaurants;
$cursor = $collection->find([
'name' => new MongoDB\BSON\Regex('^' . preg_quote('(Library)')),
]);

MongoDB의 애그리게이션 프레임워크 를 사용하면 컬렉션 데이터를 필터링, 변환 및 그룹화하는 복잡한 쿼리를 실행할 수 있습니다. MongoDBMongoDB\Collection::aggregate()메서드는 다음을 반환합니다. 객체를 반복하여 애그리게이션 작업의 결과에 액세스할 수 있습니다. 메서드의 출력에 대한 자세한 내용은 MongoDB\Collection::aggregate() 메서드의 동작 참조 를 참조하세요.

다음 예에서는 우편번호가 가장 많은 미국 5개 주를 나열합니다.

<?php
$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 필드를 포함하도록 업데이트합니다.

<?php
$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)

다음 예와 같이 업데이트가 필드 값을 기존 값으로 설정하는 경우 등 문서가 필터와 일치하지만 업데이트에 의해 수정되지는 않을 수 있습니다.

<?php
$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 필드를 포함하도록 필터 기준과 일치하는 문서를 업데이트합니다.

<?php
$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 컬렉션에 문서 하나를 삽입한 다음 해당 문서를 새 것으로 바꿉니다:

<?php
$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()을 사용하여 문서를 데이터베이스에 삽입합니다:

<?php
$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"인 첫 번째 문서를 삭제합니다.

<?php
$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"인 모든 문서를 삭제합니다.

<?php
$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)

다음도 참조하세요.

돌아가기

서버 선택 및 모니터링

다음

코덱