2014-11-17 45 views
1

我想更新少数文档中的特定字段,但不想插入该字段,如果它不存在于任何文档中。举例来说,如果我有以下三个文件在收集“测试”:MongoDB:更新多个文档,但不要插入

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

Ba从根本上说,我不希望名为“ghi”的第三个文档具有“Hits”字段。 请让我知道你的想法。 谢谢。

回答

1

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

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

由于秸秆。它有助于解决问题。但是,我不明白为什么“upsert:false”在这里没有帮助。理想情况下,upsert:false应该会得心应手。现在,即使我们删除“upsert:false”,输出也不会改变。不是吗? – Vam

+0

[upsert:false](http://docs.mongodb.org/manual/reference/method/db.collection.update/)只是说明如果没有文档匹配我们的过滤器,mongodb不应创建新文档。但是我们在这里使用['$ set'](http://docs.mongodb.org/manual/reference/operator/update/set/),它不会创建文档,而是更新它。我认为,如果使用'$ set'选项,'upsert'不是必需的。 – stalk

+0

好吧..我试图复制Mongodb.org网站的例子。这里他们使用MULTI&UPSERT,同时使用$ set更新。我从该网站复制了以下行:以下操作同时指定了多选项和upsert选项。如果存在匹配的文档,则操作会更新所有匹配的文档。如果不存在匹配的文档,则该操作将插入一个新文档。 db.books.update( {item:“EFG222”}, {$ set:{reorder:false,tags:[“literature”,“translated”]}}, {upsert:true,multi:true } ) – Vam