繁体   English   中英

从 MongoDB 中的对象字段中删除数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM