【问题标题】:MongoDB: Update multiple documents but do NOT upsertMongoDB:更新多个文档但不更新插入
【发布时间】:2015-01-14 01:30:40
【问题描述】:

我正在尝试更新少数文档中的特定字段,但如果该字段不存在于任何文档中,我不想插入该字段。例如,如果我在集合“test”中有以下三个文档:

{
Name: "abc",
Age: 10,
Hits: 1,
Score: 100
},
{
Name: "def",
Age: 20,
Hits: 1,
Score: 50
},
{
Name: "ghi",
Age: 30,
Score: 100
}

我试过这个命令:

 db.test.update({},{$set:{Hits:2}},{multi:true,upsert:false})

这是输出:

    {
    Name: "abc",
    Age: 10,
    Hits: 2,
    Score: 100
    },
    {
    Name: "def",
    Age: 20,
    Hits: 2,
    Score: 50
    },
    {
    Name: "ghi",
    Age: 30,
    Score: 100,
    Hits: 2
   }

我的预期输出是:

    {
    Name: "abc",
    Age: 10,
    Hits: 2,
    Score: 100
    },
    {
    Name: "def",
    Age: 20,
    Hits: 2,
    Score: 50
    },
    {
    Name: "ghi",
    Age: 30,
    Score: 100
    }

基本上,我不希望名为“ghi”的第三个文档包含“Hits”字段。 请让我知道你的想法。 谢谢。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    只需添加一个过滤器进行更新:

    db.test.update({Hits: {$exists: true}}, {$set: {Hits: 2}}, {multi:true, upsert:false})
    

    【讨论】:

    • 谢谢你。它有助于解决问题。但是,我不明白为什么“upsert:false”在这里没有帮助。理想情况下, upsert:false 应该派上用场。现在,即使我们删除“upsert:false”,输出也不会改变。不是吗?
    • upsert:false 只是告诉 mongodb 不应创建新文档,如果没有文档匹配我们的过滤器。但是这里我们使用$set,它不是创建文档,而是更新它。我认为,如果$set 选项upsert 是不必要的。
    • 好吧.. 我正在尝试从 Mongodb.org 网站复制示例。在这里,他们在使用 $set 更新时使用了 MULTI 和 UPSERT。我从该网站复制了以下几行:以下操作同时指定了 multi 选项和 upsert 选项。如果存在匹配的文档,则该操作会更新所有匹配的文档。如果不存在匹配的文档,则该操作插入一个新文档。 db.books.update( { item: "EFG222" }, { $set: { reorder: false, tags: [ "literature", "translated" ] } }, { upsert: true, multi: true } )
    • @VamsiKiran 是的,我明白了。因此,如果您不想在没有匹配的文档时创建新文档,请添加upsert:false,无论使用$set。在上述答案的示例中,如果我们省略upsert:false,则如果查询{Hits: {$exists: true}} 找不到文档,则将创建一个文档{Hits: 2}
    猜你喜欢
    • 2020-09-05
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多