在MongoDB中更新嵌套数组内的嵌套对象
在MongoDB中更新嵌套数组内的嵌套对象
我有一个类似以下代码的文档:
{ id : 100, heros:[ { nickname : "test", spells : [ {spell_id : 61, level : 1}, {spell_id : 1, level : 2} ] } ] }
我无法使用heros
中昵称为"test"的英雄内的spells
中的spell_id : 1
设置level : 3
。我尝试了以下查询:
db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.spells.$.level":3}});
我看到的错误是:
无法使用字符串字段名[spells]附加到数组中
感谢帮助。
更新MongoDB中数组内嵌套数组中的嵌入对象的问题出现的原因是,MongoDB目前还没有提供在更新语句中放置函数的能力。这个问题已经被提出并记录在JIRA上,但尚未得到解决。
解决方法是使用以下代码:
db.test.find({"heros.nickname":"test"}).forEach(function(x) { bool match = false; for (i=0 ; i< x.heros[0].spells.length ; i++) { if (x.heros[0].spells[i].spell_id == 1) { x.heros[0].spells[i].level = 3; match = true; } } if (match === true) db.test.update( { id: x.id }, x ); });
然而,这段代码存在一个问题,就是在查找和更新之间存在一个时间窗口,如果在该时间窗口内有其他查询在数组的相同索引处添加或删除了嵌入文档,那么更新操作将覆盖先前添加/删除的文档。
希望这篇文章对你有所帮助。