首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子阵mongoDB $pull

子阵mongoDB $pull
EN

Stack Overflow用户
提问于 2013-12-05 12:35:38
回答 2查看 908关注 0票数 2

也许这是个很受欢迎的问题,但我没有找到解决办法。我有一个包含如下元素的集合:

代码语言:javascript
复制
_id: ObjectId("52821d6c21c495b30a000015")
structure: {
  elements: [{
    id: "non-unique-id1",
    other_data: "value"
    subs: [{
      id: 1,
      field1: "somevalue",
      field2: "other value"
    }, {
      id: 2,
      field1: "somevalue",
      field2: "other value"
    }, {
      id: 3,
      field1: "somevalue",
      field2: "other value"
    }]
  }, {
    id: "non-unique-id2",
    subs: [{
      id: 1,
      field1: "somevalue",
      field2: "other value"
    }, {
      id: 2,
      field1: "somevalue",
      field2: "other value"
    }, {
      id: 3,
      field1: "somevalue",
      field2: "other value"
    }]
  }]
}

现在,如果子数组是id,我想从子数组中删除一个元素。我希望删除发生在所有element字段上。

我尝试了以下方法,但即使没有错误,也不会发生任何事情:

代码语言:javascript
复制
db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015")
},{
  $pull: {
    "structure.elements.subs": {id: 2}
  }
})

这应该已经用id: 2删除了哈希的2次出现。

也尝试过$pullAll,但是我得到了一个错误:

代码语言:javascript
复制
Modifier $pushAll/pullAll allowed for arrays only

关于如何实现我的目标,有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 14:29:13

您可以使用$,但查询将只删除1个subs,对于示例中的两个子子,您必须运行两次update。您需要编写一个脚本来迭代您的文档。

代码语言:javascript
复制
db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015"),
  "structure.elements.subs.id": 2
},{
  $pull: {
    "structure.elements.$.subs": {"id": 2}
  }
});

如果您需要临时的管理操作,这是可以的,但是对于应用程序的性能来说太糟糕了

对不起我的英语很差:)

票数 1
EN

Stack Overflow用户

发布于 2013-12-05 13:42:09

Mongo对更新嵌套数组的支持非常弱。您必须在您的elements中分别针对每个$pull数组元素

代码语言:javascript
复制
db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015")
},{
  $pull: {
    "structure.elements.0.subs": {id: 2},
    "structure.elements.1.subs": {id: 2}
  }
})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20400211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档