[英]Remove array from objects field in MongoDB
我试图通过数组元素中的 ObjectId 找到它来删除 Array 的元素。 跟随MongoDB 对 $addToSet 到 '$removeFromSet' ,我应该能够做到:
db.collection.update(
{name: 'nameOfNode'},
{$pull: { activities: ["5e7d16e9736bb64bdd158c13"]}})
或者
db.collection.update(
{name: 'nameOfNode'},
{$pull: { activities: ["5e7d16e9736bb64bdd158c13", "Materi"]}})
然而,上面的这两个代码都不起作用,是否有另一种方法可以通过一个值删除它们,或者如果不可能,用两个值删除它们?
注意:我从屏幕截图中删除了一些机密信息,因此字母之间的假定间隙不是空格,而是被覆盖的文本。 我试图用来指代它们的字符串是相同的,但没有区别。
我看到代码有 2 个问题: - 该值不是activities
数组的成员,它是包含在activities
数组中的数组的成员 - 搜索类似activities: ["5e7d16e9736bb64bdd158c13"]
的字符串activities: ["5e7d16e9736bb64bdd158c13"]
将不匹配值ObjectId 类型。
我运行了一个匹配 ObjectId 的快速演示:
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d354ccede22b56b5335bc"), "name" : "nameOfNode", "activities" : [ [ ObjectId("5e7d354ccede22b56b5335b9"), "Check-in" ], [ ObjectId("5e7d354ccede22b56b5335ba"), "Materi" ], [ ObjectId("5e7d354ccede22b56b5335bb"), "Materi" ] ] }
MongoDB Enterprise replset:PRIMARY> db.updtest.update({"name" : "nameOfNode"},{$pull:{"activities.0":ObjectId("5e7d354ccede22b56b5335b9")}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d354ccede22b56b5335bc"), "name" : "nameOfNode", "activities" : [ [ "Check-in" ], [ ObjectId("5e7d354ccede22b56b5335ba"), "Materi" ], [ ObjectId("5e7d354ccede22b56b5335bb"), "Materi" ] ] }
请注意,虽然这成功删除了 ObjectId 值,但它不会删除包含数组,这正是我认为您想要的。
如果您使用的是 MongoDB 4.2,则可以使用$filter
删除整个子元素,例如:
db.updtest.update(
{"name" : "nameOfNode"},
[ {$set:{
activities:{
$filter:{
input:"$activities",
cond:{$ne:["$this.0",ObjectId("5e7d16e9736bb64bdd158c13")]}
}
}
}}]
)
如果您可以修改架构,请将活动作为对象而不是子数组插入。 例如,如果每个活动的形式都是{id:... type: ...}
,您可以使用 $pull 匹配特定的 id:
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d3939cede22b56b5335c4"), "name" : "nameOfNode", "activities" : [ { "id" : ObjectId("5e7d3939cede22b56b5335c1"), "type" : "Check-in" }, { "id" : ObjectId("5e7d3939cede22b56b5335c2"), "type" : "Materi" }, { "id" : ObjectId("5e7d3939cede22b56b5335c3"), "type" : "Materi" } ] }
MongoDB Enterprise replset:PRIMARY> db.updtest.update({"name" : "nameOfNode"},{$pull:{"activities":{id:ObjectId("5e7d3939cede22b56b5335c2")}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d3939cede22b56b5335c4"), "name" : "nameOfNode", "activities" : [ { "id" : ObjectId("5e7d3939cede22b56b5335c1"), "type" : "Check-in" }, { "id" : ObjectId("5e7d3939cede22b56b5335c3"), "type" : "Materi" } ] }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.