2014-11-17 42 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