使用MongoDB $ pull删除数组中的文档

时间:2013-02-27 20:29:22

标签: 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字段和members字段。成员字段是一组文档,具有以下格式。

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

现在,我不得不通过匹配tweetID来删除集群文档的成员属性中的这些子文档。

但是,我无法找到实现此效果的查询。基本上,tweetID将参与许多集群,因此将出现在各种集群的“成员”属性的多个子文档中。我想提供批量$ pull操作,我可以删除所有群集中的所有子文档(即其成员属性),这些子文档与特定的tweetID匹配。

一些帮助和直觉将非常有帮助。

4 个答案:

答案 0 :(得分:23)

这正是$pull运算符所做的,所以在shell中你可以使用update之类的:

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

设置multi选项,以便更新每个文档,而不仅仅是第一个文档。

答案 1 :(得分:8)

这会在单个查询中删除multiple tweets,只需将数组传递给$in: -

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

上述方法在猫鼬中不起作用 所以对于猫鼬来说: -

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

答案 2 :(得分:3)

同时,不建议使用update方法。因此,对此可能的最新解决方案是改用updateMany方法。

  void initState() {
    super.initState();
    Future.delayed(Duration.zero,() {
      getLessonFromJSON(context);
      print("lessonDescription: ${_lesson[0].lessonTitle}");
    });
  }

答案 3 :(得分:0)

<块引用>

注意:在 "mongoose": "^5.12.13" 中使用。

至于今天 2021 年 6 月 22 日,您可以使用 $in$pull mongodb 运算符从文档数组中删除项目:

父文档:

{
    "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",
}

Items 数组中的文档:

{
    "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'
]