更新MongoDB中嵌套数组中的值

时间:2014-01-27 20:00:45

标签: arrays mongodb

我发现这个答案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个关于更新嵌套数组的问题,但在这种情况下,它们的答案似乎没有帮助。那么我们如何修改内部数组中的值?

2 个答案:

答案 0 :(得分:1)

我认为你要找的是findAndyModifySee the documentation here.

基本上,您可以包含查询,删除项目以及一次性更新文档。例如,如果您想:

  1. Keys子文档中找到所有带有'apple'的文档
  2. 删除所有'apple'
  3. 的实例
  4. 在数组末尾添加'peach'
  5. 它可能看起来像这样:

    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})