我想更新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
}
请帮帮我。
答案 0 :(得分:0)
您可以尝试使用$ addToSet在数组中添加元素
db.collection.update({“_ id”:ObjectId(“561b4c83e3603fcd1badaeb3”),“countries.states.state”:“Kerala”},{$ addToSet:{“countries。$。states”:{“state “:”Goa“}}})
希望它会有所帮助
答案 1 :(得分:0)
Mongo不支持多个位置运算符。你必须使用mongo的foreach method
来使用jsdb.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
希望这会对某人有所帮助。