我在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匹配。
一些帮助和直觉将非常有帮助。
答案 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'
]