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

MongoDB에서 $pull 연산자로 기존 레코드를 제거하고 업데이트하는 방법

MongoDB에서 배열 안에 포함된 기존 레코드(하위 문서)를 제거하면서 동시에 문서를 업데이트하려면 $pull 연산자를 사용하면 됩니다. $pull은 지정한 조건과 일치하는 배열 요소를 삭제해 주는 업데이트 연산자입니다.

1. 샘플 컬렉션 생성

먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.

> db.removeDemo.insertOne(
...     {
...        "UserName" : "Larry",
...        "UserDetails" : [
...           {
...              "_id" : 101,
...              "UserEmailId" : "976Larry@gmail.com",
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7f9f88f9e6ff3eb0ce446")
}
> db.removeDemo.insertOne(
...     {
...        "UserName" : "Mike",
...        "UserDetails" : [
...           {
...              "_id" : 102,
...              "UserEmailId" : "Mike121@gmail.com",
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7f9f98f9e6ff3eb0ce447")
}

각 문서는 UserName 필드와, 사용자 상세 정보를 담고 있는 UserDetails 배열로 구성되어 있습니다.

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.removeDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5cc7f9f88f9e6ff3eb0ce446"),
    "UserName" : "Larry",
    "UserDetails" : [
       {
          "_id" : 101,
          "UserEmailId" : "976Larry@gmail.com"
       }
    ]
}
{
    "_id" : ObjectId("5cc7f9f98f9e6ff3eb0ce447"),
    "UserName" : "Mike",
    "UserDetails" : [
       {
          "_id" : 102,
          "UserEmailId" : "Mike121@gmail.com"
       }
    ]
}

3. $pull 연산자로 레코드 제거 및 업데이트

이제 $pull 쿼리를 실행하여 특정 조건에 맞는 기존 레코드를 배열에서 제거해 보겠습니다. 여기서는 _id가 102인 UserDetails 항목을 삭제합니다.

> db.removeDemo.update(
...    {"_id": ObjectId("5cc7f9f98f9e6ff3eb0ce447")},
...    { "$pull": { "UserDetails": {"_id": 102}}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과 nMatched: 1, nModified: 1이 반환되었으므로, 해당 문서가 정상적으로 매칭되어 업데이트되었음을 알 수 있습니다.

4. 삭제 결과 검증

객체가 실제로 제거되었는지 확인하기 위해 컬렉션의 문서를 다시 조회해 보겠습니다.

> db.removeDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5cc7f9f88f9e6ff3eb0ce446"),
    "UserName" : "Larry",
    "UserDetails" : [
       {
          "_id" : 101,
          "UserEmailId" : "976Larry@gmail.com"
       }
    ]
}
{
    "_id" : ObjectId("5cc7f9f98f9e6ff3eb0ce447"),
    "UserName" : "Mike",
    "UserDetails" : [ ]
}

출력 결과를 보면 Mike 문서의 UserDetails 배열이 비어 있는 것을 확인할 수 있습니다. 즉, $pull 연산자를 통해 _id: 102에 해당하는 하위 문서가 성공적으로 제거되었습니다.

정리

MongoDB에서 배열 내부의 특정 요소만 삭제하면서 부모 문서를 유지해야 한다면 $pull 연산자가 가장 적합한 선택입니다. 조건을 객체 형태로 지정하기 때문에 중첩된 필드 값까지 정확하게 매칭하여 안전하게 제거할 수 있다는 장점이 있습니다.