MongoDB:更新多个文档,但不向上插入

MongoDB:更新多个文档,但不向上插入,mongodb,Mongodb,我正在尝试更新少数文档中的特定字段,但如果该字段不存在于任何文档中,则不希望插入该字段。例如,如果我在集合“测试”中有以下三个文档: 我试过这个命令: db.test.update({},{$set:{Hits:2}},{multi:true,upsert:false}) 以下是输出: { Name: "abc", Age: 10, Hits: 2, Score: 100 }, { Name: "def", Age: 2

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

我试过这个命令:

 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”。 请让我知道你的想法。
谢谢。

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

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

谢谢。这有助于解决问题。但是,我不明白为什么“upsert:false”在这里没有帮助。理想情况下,upsert:false应该很方便。现在,即使我们删除“upsert:false”,输出也不会改变。不是吗?只是告诉mongodb,如果没有与我们的过滤器匹配的文档,则不会创建新文档。但这里我们使用的不是创建文档,而是更新文档。我认为,在
$set
的情况下,没有必要选择
upsert
。。我试图复制Mongodb.org网站上的示例。在这里,他们在使用$set更新时使用了MULTI&UPSERT。我从该网站复制了以下行:以下操作同时指定了multi选项和upsert选项。如果存在匹配的文档,则该操作将更新所有匹配的文档。如果不存在匹配的文档,则该操作将插入新文档。更新({item:“EFG222”},{$set:{reorder:false,tags:[“文学”,“翻译的”]},{upsert:true,multi:true})这里是链接:@VamsiKiran是的,我明白了。因此,如果您不想在没有匹配文档的情况下创建新文档,则添加
upsert:false
,而不考虑使用
$set
。在上面答案中的示例中,如果省略
upsert:false
,那么如果查询
{Hits:{$exists:true}}
未找到任何文档,则将创建一个文档
{Hits:2}
db.test.update({Hits: {$exists: true}}, {$set: {Hits: 2}}, {multi:true, upsert:false})