배열 필드에 값을 추가하려면 update() 메서드와 함께 $push 연산자를 사용하고, 이때 multi 옵션을 TRUE로 설정해야 합니다. 먼저 예제용 문서가 담긴 컬렉션을 생성해 보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
insertOne() 메서드로 세 개의 문서를 순차적으로 삽입합니다.
> db.demo747.insertOne({"CountryName":["US","IND"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae6a50a930c785c834e55f")
}
> db.demo747.insertOne({"CountryName":["UK","US"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae6a57a930c785c834e560")
}
> db.demo747.insertOne({"CountryName":["UK","IND"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae6a60a930c785c834e561")
}2단계: 전체 문서 조회
find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.
> db.demo747.find();
위 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5eae6a50a930c785c834e55f"), "CountryName" : [ "US", "IND" ] }
{ "_id" : ObjectId("5eae6a57a930c785c834e560"), "CountryName" : [ "UK", "US" ] }
{ "_id" : ObjectId("5eae6a60a930c785c834e561"), "CountryName" : [ "UK", "IND" ] }3단계: $push와 multi 옵션으로 모든 문서 업데이트
다음은 update()에서 $push를 구현하는 올바른 쿼리입니다. 세 번째 인자인 {multi:true}는 조건에 일치하는 모든 문서를 한 번에 업데이트하도록 지정합니다. 이 옵션을 생략하면 첫 번째로 일치하는 문서 하나만 수정되므로 주의해야 합니다.
> db.demo747.update({},{$push:{CountryName:"AUS"}},{multi:true});
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })실행 결과 nMatched와 nModified가 모두 3으로 표시되며, 이는 세 개의 문서가 모두 성공적으로 수정되었음을 의미합니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo747.find();
모든 문서의 CountryName 배열 끝에 "AUS"가 추가된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5eae6a50a930c785c834e55f"), "CountryName" : [ "US", "IND", "AUS" ] }
{ "_id" : ObjectId("5eae6a57a930c785c834e560"), "CountryName" : [ "UK", "US", "AUS" ] }
{ "_id" : ObjectId("5eae6a60a930c785c834e561"), "CountryName" : [ "UK", "IND", "AUS" ] }정리
$push 연산자는 배열 필드의 마지막에 새 값을 추가하며, 업데이트 조건을 빈 객체({})로 지정하면 컬렉션 내 모든 문서가 대상이 됩니다. 단, 일치하는 모든 문서에 변경 사항을 적용하려면 반드시 multi:true 옵션을 함께 사용해야 합니다.