我发现这个答案https://stackoverflow.com/a/12636038/11792对我如何查询嵌套数组非常有帮助。我现在想要的是能够更新(推或替)嵌套数组中的值。例如,我想用“桃子”替换所有“苹果”值。
db.multiArr.insert({"ID" : "fruit1","Keys" : [["apple", "carrot", "banana"]]})
db.multiArr.insert({"ID" : "fruit2","Keys" : [["apple", "orange", "banana"]]})
我发现了另外3个关于更新嵌套数组的问题,但在这种情况下,它们的答案似乎没有帮助。那么我们如何修改内部数组中的值?
答案 0 :(得分:1)
我认为你要找的是findAndyModify
。 See the documentation here.
基本上,您可以包含查询,删除项目以及一次性更新文档。例如,如果您想:
Keys
子文档中找到所有带有'apple'的文档它可能看起来像这样:
db.multiArr.findAndModify({
query: { Keys : 'apple' },
update: { $pull : { Keys : 'apple' }}, { $push : { Keys : 'peach' }},
new: true
});
编辑:
The above looks like it should work, but you can't use $push
and $pull
together in one update。它会产生以下错误消息:
findAndModifyFailed failed: {
"errmsg" : "exception: Field name duplication not allowed with modifiers",
"code" : 10150,
"ok" : 0
} at src/mongo/shell/collection.js:399
你只需要进行两次更新:
// $push first or you won't be able to find the documents
db.multiArr.update({ Keys : 'apple' }, { $push : { Keys : 'peaches' }}, { multi : true });
db.multiArr.update({ Keys : 'apple' }, { $pull : { Keys : 'apple' }}, { multi : true });
答案 1 :(得分:0)
要添加到上一个答案,如果你知道'apple'的索引,你可能会硬编码如下:
db.multiArr.update({Keys:"apple"}, {$set: {"Keys.0":"peaches"}}, {multi:true})