programing

MongoDB $pull을 사용하여 배열 내의 문서 삭제

linuxpc 2023. 6. 20. 21:24
반응형

MongoDB $pull을 사용하여 배열 내의 문서 삭제

MongoDB에 다음과 같은 컬렉션이 있습니다.

{
    "_id" : "5327010328645530500",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "2820402625046999289"
        },
        {
            "participationCoeff" : 0.6666666666666666,
            "tweetID" : "6122060484520699114"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "4656669980325872747"
        }
    ]
}
{
    "_id" : "2646953848367646922",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "2646953848367646922"
        },
        {
            "participationCoeff" : 0.75,
            "tweetID" : "7750833069621794130"
        },
        {
            "participationCoeff" : 0.5,
            "tweetID" : "6271782334664128453"
        }
    ]
}

기본적으로 컬렉션에는 클러스터가 있고 클러스터에는 클러스터가 있습니다._id필드와 amembers필드. 구성원 필드는 다음과 같은 형식의 문서 배열입니다.

{
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        }

이제 가끔 트윗을 일치시켜 클러스터 문서의 구성원 속성에 있는 하위 문서를 삭제해야 합니다.신분증.

그러나 이 효과를 얻을 수 있는 쿼리를 찾을 수 없습니다.기본적으로, 트윗은ID는 많은 클러스터에 참여하므로 다양한 클러스터의 '구성원' 속성의 여러 하위 문서에 나타납니다.특정 트윗에 일치하는 모든 클러스터의 모든 하위 문서(즉, 구성원 속성)를 제거할 수 있는 대량 $pull 작업을 제공하고 싶습니다.신분증.

약간의 도움과 직관이 정말 도움이 될 것입니다.

그것이 바로 그 것입니다.$pull연산자가 하기 때문에 셸에서 사용할 수 있습니다.update예:

db.clusters.update({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}}, 
    {multi: true})

설정multi옵션을 선택하면 첫 번째 문서뿐만 아니라 모든 문서가 업데이트됩니다.

삭제합니다.multiple tweets단일 쿼리에서 어레이를 전달합니다.$in:-

db.clusters.update({}, 
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } }, 
{multi: true});

위의 방법은 몽구스에서 작동하지 않기 때문에 몽구스의 경우 작동합니다.

 db.clusters.update({}, 
{$pull: {members:[ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ]  } });

한편 업데이트 방법은 더 이상 사용되지 않습니다.따라서 이에 대한 가능한 최신 솔루션 중 하나는 updateMany 메서드를 대신 사용하는 것입니다.

db.clusters.updateMany({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}})

참고: 사용됨"mongoose": "^5.12.13".

2021년 6월 22일 오늘에 관해서는, 당신은 사용할 수 있습니다.$in그리고.$pullmongodb 연산자를 사용하여 문서 배열에서 항목을 제거합니다.

상위 문서:

{
    "name": "June Grocery",
    "description": "Remember to pick Ephraim's favorit milk",
    "createdDate": "2021-06-09T20:17:29.029Z",
    "_id": "60c5f64f0041190ad312b419",
    "items": [],
    "budget": 1500,
    "owner": "60a97ea7c4d629866c1d99d1",
}

항목 배열의 문서:

{
    "category": "Fruits",
    "bought": false,
    "id": "60ada26be8bdbf195887acc1",
    "name": "Kiwi",
    "price": 0,
    "quantity": 1
},
{
    "category": "Toiletry",
    "bought": false,
    "id": "60b92dd67ae0934c8dfce126",
    "name": "Toilet Paper",
    "price": 0,
    "quantity": 1
},
{
    "category": "Toiletry",
    "bought": false,
    "id": "60b92fe97ae0934c8dfce127",
    "name": "Toothpaste",
    "price": 0,
    "quantity": 1
},
{
    "category": "Toiletry",
    "bought": false,
    "id": "60b92ffb7ae0934c8dfce128",
    "name": "Mouthwash",
    "price": 0,
    "quantity": 1
},
{
    "category": "Toiletry",
    "bought": false,
    "id": "60b931fa7ae0934c8dfce12d",
    "name": "Body Soap",
    "price": 0,
    "quantity": 1
},
{
    "category": "Fruit",
    "bought": false,
    "id": "60b9300c7ae0934c8dfce129",
    "name": "Banana",
    "price": 0,
    "quantity": 1
},
{
    "category": "Vegetable",
    "bought": false,
    "id": "60b930347ae0934c8dfce12a",
    "name": "Sombe",
    "price": 0,
    "quantity": 1
},

쿼리:

MyModel.updateMany(
    { _id: yourDocumentId },
    { $pull: { items: { id: { $in: itemIds } } } },
    { multi: true }
);

참고: ItemIds는 다음의 배열입니다.ObjectId아래 참조:

[
  '60ada26be8bdbf195887acc1',
  '60b930347ae0934c8dfce12a',
  '60b9300c7ae0934c8dfce129'
] 

언급URL : https://stackoverflow.com/questions/15121758/using-mongodb-pull-to-delete-documents-within-an-array

반응형