mongoDB $来自子阵列

时间:2013-12-05 12:35:39

标签: mongodb mongoid

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

_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"
    }]
  }]
}

现在我想从sub子阵列中删除一个元素,因为它是id。我希望删除发生在所有element字段上。

我尝试了以下内容,但即使我没有收到错误,也没有任何反应:

db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015")
},{
  $pull: {
    "structure.elements.subs": {id: 2}
  }
})

这应该已经使用id: 2

删除了2次哈希

尝试了$pullAll,但我收到了错误:

Modifier $pushAll/pullAll allowed for arrays only

关于如何实现目标的任何想法?

2 个答案:

答案 0 :(得分:2)

Mongo对更新嵌套数组的支持非常弱。您必须在elements

中单独定位每个$pull数组元素
db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015")
},{
  $pull: {
    "structure.elements.0.subs": {id: 2},
    "structure.elements.1.subs": {id: 2}
  }
})

答案 1 :(得分:1)

您可以使用$,但查询只会删除1个潜艇,对于您的示例的两个潜艇,您必须运行两次更新。您需要编写一个脚本来迭代您的文档。

db.objects.update({
  "_id" : ObjectId("52821d6c21c495b30a000015"),
  "structure.elements.subs.id": 2
},{
  $pull: {
    "structure.elements.$.subs": {"id": 2}
  }
});

如果您需要进行临时管理操作,则可以,但对于应用程序性能太差

抱歉我的英语不好:)