Mongoose / MongoDB - 如何将新数组元素推送到正确的父数组元素上

时间:2015-10-21 15:17:36

标签: mongodb mongoose mongodb-query

mongodb 3.0.7 mongoose 4.1.12

我想推出新元素:" bbb" 置于外部orgs数组内的group数组...

原始mongo数据来自:

{
    orgs: [
        {
            org: {
                _bsontype: "ObjectID",
                id: "123456789012"
            },
            groups: [
                "aaa"
            ]
        }
    ],
    _id: {
        _bsontype: "ObjectID",
        id: "888888888888"
    }
}

到此:

{
    orgs: [
        {
            org: {
                _bsontype: "ObjectID",
                id: "123456789012"
            },
            groups: [
                "aaa",
                "bbb"
            ]
        }
    ],
    _id: {
        _bsontype: "ObjectID",
        id: "888888888888"
    }
}

这是一个我不想要的硬编码解决方案 硬编码数组索引(参见:' orgs.0.groups')

dbModel.findByIdAndUpdate(

    { _id: ObjectId("888888888888".toHex()), 'orgs.org' : ObjectId("123456789012".toHex()) },
    {   $push : { 'orgs.0.groups' : 'bbb'  
                }
    },
    {   safe: true, 
        upsert: false, 
        new : true
    }
)

......我希望有一个简单的组织。$。群组'会工作,但没有。还试过了orgs.groups' ,也没有。 我是否真的需要首先检索orgs数组,识别索引 然后执行一些第二次操作来推送适当的orgs数组元素?

PS - 建议重复的答案没有解决这个问题

1 个答案:

答案 0 :(得分:1)

找到解决方案,不得不使用

dbModel.update 

dbModel.findOneAndUpdate nor dbModel.findByIdAndUpdate

使用' $'在多级文档中指示匹配的数组索引

'orgs.$.groups'

此代码有效:

dbModel.update(

    { _id: ObjectId("888888888888".toHex()), 'orgs.org' : ObjectId("123456789012".toHex()) },
    {   $push : { 'orgs.$.groups' : 'bbb'  
                }
    },
    {   safe: true, 
        upsert: false, 
        new : true
    }
)

我想知道这是不是猫鼬的错误?似乎奇怪的findOneAndUpdate无法正常工作。