Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 $pull과 multi 옵션으로 배열의 여러 값 한 번에 제거하는 방법

개요

MongoDB에서 배열 필드에 포함된 특정 값을 제거하려면 $pull 연산자를 사용합니다. 여러 문서에 동시에 적용하려면 multi: true 옵션을 함께 설정해야 합니다. 이 글에서는 실제 예제를 통해 두 문서의 배열에서 동일한 값을 한 번에 제거하는 과정을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용하여 demo392라는 컬렉션을 생성하고 문서 두 개를 삽입합니다. 각 문서는 Name 필드와 details 배열을 가지고 있으며, details 배열 안에는 _id가 '101'인 요소가 공통으로 포함되어 있습니다.

> db.demo392.insertOne(
...    {
...       Name: 'Chris',
...       details: [
...          {
...             _id: '101'
...          },
...          {
...             _id: '102'
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5d2b3322064be7ab44e802")
}
>
> db.demo392.insertOne(
...    {
...       Name: 'Chris',
...       details: [
...          {
...             _id: '104'
...          },
...          {
...             _id: '101'
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5d2b3422064be7ab44e803")
}

2단계: find() 메서드로 전체 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo392.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5e5d2b3322064be7ab44e802"), "Name" : "Chris", "details" : [
      { "_id" : "101" }, { "_id" : "102" }
   ]
}
{
   "_id" : ObjectId("5e5d2b3422064be7ab44e803"), "Name" : "Chris", "details" : [
      { "_id" : "104" }, { "_id" : "101" }
   ]
}

출력 결과에서 확인할 수 있듯이, 두 문서 모두 details 배열에 _id가 '101'인 요소를 포함하고 있습니다.

3단계: $pull과 multi: true로 배열 값 제거

이제 $pull 연산자를 사용하여 배열에서 _id가 '101'인 요소를 제거합니다. 첫 번째 인수로 빈 조건({ })을 전달하면 컬렉션의 모든 문서가 대상이 되고, 세 번째 인수로 { multi: true }를 지정하면 일치하는 모든 문서에 업데이트가 적용됩니다.

> db.demo392.update(
...    { },
...    { $pull: { details: { _id: '101' } } },
...    { multi: true }
> )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

실행 결과 nMatched와 nModified가 모두 2로 표시되는데, 이는 두 개의 문서가 조건에 일치했고 두 문서 모두 성공적으로 수정되었음을 의미합니다.

4단계: 업데이트 후 결과 확인

다시 find() 메서드를 사용하여 변경된 문서를 조회합니다.

> db.demo392.find();

업데이트 후 출력 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e5d2b3322064be7ab44e802"), "Name" : "Chris", "details" : [ { "_id" : "102" } ] }
{ "_id" : ObjectId("5e5d2b3422064be7ab44e803"), "Name" : "Chris", "details" : [ { "_id" : "104" } ] }

두 문서의 details 배열에서 _id가 '101'인 요소가 모두 제거된 것을 확인할 수 있습니다.

정리

$pull 연산자는 배열에서 지정한 조건과 일치하는 요소를 제거할 때 사용합니다. 기본적으로 update() 메서드는 일치하는 첫 번째 문서만 수정하지만, multi: true 옵션을 추가하면 조건에 일치하는 모든 문서의 배열에서 해당 값을 한 번에 제거할 수 있습니다. 참고로 최신 버전의 MongoDB에서는 updateMany() 메서드를 사용하면 multi 옵션 없이도 동일한 결과를 얻을 수 있습니다.