MongoDB $ pull语法

时间:2014-10-02 16:52:11

标签: mongodb mongodb-query

我在Mongodb中有一个(希望)小的语法问题。

bulk.find({_id: new mongo.ObjectID(req.session._id)}).updateOne({$pull: {
  firstArray: {id: req.params.id},
  'secondArray.firstArrayIds': req.params.id
  'secondArray.$.firstArrayIds': req.params.id
}});

firstArray $pull效果很好。 但是secondArray.firstArrayIds和/或secondArray。$。firstArrayIds没有。我在这做错了什么?

这是我的数据结构:

clients: {
  firstArray: [
    {
      _id: '153'.
      someField1: 'someVal1',
    }
    ...
  ]

  secondArray: [
    {
      _id: '7423'.
      someField1: 'someVal1',
      firstArrayIds: [153, 154, 155, ...]
    }
    ...
  ]
}

编辑如果secondArray中有多个嵌入对象firstArrayIds可以包含我要删除的ID,该怎么办?换句话说,当删除firstdArray中的对象时,我想删除所有 secondArray firstArrayIds中的引用不仅仅是第一个匹配项。

1 个答案:

答案 0 :(得分:2)

你的" secondArray"具有嵌套元素结构,因此在更新中使用位置$运算符时,必须标识要在查询中匹配的外部元素。你基本上需要这样的东西:

bulk.find({ 
    "_id": new mongo.ObjectID(req.session._id), 
    "secondArray._id": "7423" 
}).update({
    "$pull": { 
        "firstArray": { "_id": "153" },
        "secondArray.$.firstArrayIds": 153
    }
});
事实上,实际上有"两个"除了常规文档ID之外,您需要传入请求的ID值。即使这是嵌套的,也可以,因为你只匹配"外部"级别,仅在一个阵列上。如果您尝试匹配多个阵列上的位置,则位置运算符无法实现此目的。