具有多种条件的Mongodb插入

时间:2014-09-16 19:21:44

标签: json mongodb updates mongodb-query

我在一个集合中有多个文档,每个文档都有这样的数据结构:

{
    _id: "some object id",
    data1: [
        {
            data2_id : 13233,
            data2: [
                {
                    sub_data1: "text1",
                    sub_data2: "text2",
                    sub_data3: "text3",

                },
                {
                    sub_data1: "text4",
                    sub_data2: "text5",
                    sub_data3: "text6",
                }
            ]
        },
        {
            data2_id : 53233,
            data2: [
                {
                    sub_data1: "text4",
                    sub_data2: "text5",
                    sub_data3: "text6",

                }
               ...
            ]
        },
        {
            data2_id : 56233,
            data2: [
                {
                    sub_data1: "text7",
                    sub_data2: "text8",
                    sub_data3: "text9",

                }
                 ...
            ]
        },
        {
            data2_id : 53236,
            data2: [
                {
                    sub_data1: "text10",
                    sub_data2: "text22",
                    sub_data3: "text33",

                }
                ...
            ]
        }
    ]
}

我想更新为一组匹配某些条件的ID,只更新文档中的子对象。

我试过这个:

db.collection.update({
    "$and": [
        {
            "_id": {
                "$in": [
                    {
                        "$id": "54369aca9bc25af3ca8b4568"
                    },
                    {
                        "$id": "54369aca9bc25af3ca8b4562"
                    }
                ]
            }
        },
        {
            "data1.data2": {
                "$elemMatch": {
                    "sub_data1": "text4",
                    "sub_data2": "text5"
                }
            }
        }
    ]
},
{
   "data1.data2.$.sub_data3" : "text updated"
}
)

但是我收到以下错误:

将数据更新到MongoDB失败:dev。**。com:27017:无法使用部分(data1.data2.0.sub_data3的data2)遍历元素...

任何想法?

1 个答案:

答案 0 :(得分:0)

在尝试更新嵌套在另一个数组中的数组元素时,存在一个开放问题here,这会产生一个限制。

此外,您可以在此处进行一些改进:

  1. 对于您的查询,您并不需要$和

    db.collection.update( {   “_ID”: {     “$ in”:[       {“$ id”:“54369aca9bc25af3ca8b4568”},       {“$ id”:“54369aca9bc25af3ca8b4562”}     ]},   “data1.data2”:{     “$ elemMatch”:{       “sub_data1”:“text4”,       “sub_data2”:“text5”     } },{..更新...})

  2. 您可能想要使用$ set:

    db.collection.update(query,{$ set:{“name”:“Mike”}})

  3. 否则,您可能会丢失文档中的其余数据。