Mongoose $ push无法将对象推送到正确的文档中

时间:2015-01-03 09:58:37

标签: node.js mongoose

我有一个像这样的猫鼬模式:

A = {
    _id: Schema.Types.ObjectId,
    arrayA:[{
       _id,
       nestedArray: [Schema.Types.ObjectId]
    }],
    arrayB: [Schema.Types.ObjectId]
}     

我想将Object Id推送到特定arrayA对象AND中的nestedArray arrayB应该包含一个特定的Object Id,代码如下:

A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
{$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});

但是,Object Id被推送到arrayA中最后一个对象的nestedArray。 如果删除arrayB: {$in: [arrayContainsSomeArrayBIds]},则可以将Object Id推送到arrayA中的正确对象。

猫鼬版:3.8.21

任何人都可以帮我找出问题吗?

1 个答案:

答案 0 :(得分:0)

目前,MongoDB无法使用positional运算符更新数组元素,当查询文档包含对正在更新的数组之外的其他数组的引用时。

以下代码包含对两个数组字段的引用:arrayAarrayB,何时 更新发布在arrayA。这是无效的,会导致不良行为。

A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
  {$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});

来自docs

  

查询文档中只能出现一个数组字段。   查询文档应该只包含数组字段上的单个条件   被投射。   多个条件可能会互相覆盖   内部并导致未定义行为。   根据这些要求,   以下查询不正确:

 db.collection.find( { <array>: <value>, <someOtherArray>: <value2> },
                     { "<array>.$": 1 } )

解决方案是修改您的代码以触发两个查询:

  • 获取符合我们条件的_ids文件。
  • 然后执行更新。

示例代码流程:

A.find({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
      function(err,data){
       data.forEach(function(doc){
           A.update({'arrayA._id': arrayAId,
                      "_id":doc._id},
                    {$push: {'arrayA.$.nestedArray': nestedArrayId}}, 
                    function(err) {
                    });
       })
});