在mongodb中更新深层嵌套的数组元素

时间:2015-10-12 11:19:15

标签: mongodb mongodb-query

我想更新mongodb集合中的内部元素state字段,我在下面给出了集合和我的mongodb更新语句。

    {
        "_id" : ObjectId("561b4c83e3603fcd1badaeb3"),
        "continent" : "Asia",
        "countries" : [
            {
                "country" : "India",
                "_id" : ObjectId("561b83c3626fca4a23c0131f"),
                "states" : [
                    {
                        "state" : "Kerala"
                    }
                 ........ many other states
                ]
            }
        ],
        "__v" : 0
    }

我使用了这个mongodb查询。

    db.places.update({ "_id" : ObjectId("561b4c83e3603fcd1badaeb3"), "countries.states.state": "Kerala" },{ $set: { "country.$.states.$.state": "Tamilnad" } } );

预期结果

    {
        "_id" : ObjectId("561b4c83e3603fcd1badaeb3"),
        "continent" : "Asia",
        "countries" : [
            {
                "country" : "India",
                "_id" : ObjectId("561b83c3626fca4a23c0131f"),
                "states" : [
                    {
                        "state" : "Goa"
                    }
                 ........ many other states
                ]
            }
        ],
        "__v" : 0
    }

请帮帮我。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用$ addToSet在数组中添加元素

  

db.collection.update({“_ id”:ObjectId(“561b4c83e3603fcd1badaeb3”),“countries.states.state”:“Kerala”},{$ addToSet:{“countries。$。states”:{“state “:”Goa“}}})

希望它会有所帮助

答案 1 :(得分:0)

Mongo不支持多个位置运算符。你必须使用mongo的foreach method

来使用js
db.coll.find().forEach(function( doc ) {
  //supposing only one country will match the query 
    var statesCount = doc.countries[0].states.length;
    for(var i=0; i<statesCount; i++){
        if(doc.countries[0].states[i].state == "Kerala"){
            doc.countries[0].states[i].state = "Goa";
        }       
    }
    db.coll.save(doc);
});

另一个选项:此功能应在3.5.12版中修复,请参阅here

希望这会对某人有所帮助。