2012-08-29 31 views
0

在我UPSERT要求,我想這兩個:使用改性劑或在UPSERT查詢提供一個對象

  • 更新到位的對象,如果它的存在,又名

    db.somecollection.update({x: 1}, {$inc: {x: 1}}); 
    
  • 提供了新的對象,如果它不存在,又名

    db.somecollection.update({x: 1}, {whole: 0, new: 'yata', object: 42}); 
    

有沒有辦法做到這一點?

問題是,只有當你已經在第一個地方提供了一個對象,而不是一個修飾符時,upsert才起作用。

編輯:我會更具體。

我想更新的形式

{_id: 12, a: 123, b: 234, c: 345} 

的對象我的更新僅僅是一個的a一個,bc遞增1。如果對象不在基地,然後我想創建形式

{_id: 13, a: 1, b: 0, c: 0} 

的對象,如果a是我試圖增加該領域。現在

,如果我正確地閱讀手冊,我可以寫

db.somecollection.update({_id: 12}, {$inc: {a: 1}}, true); 

這將很好地工作來更新我的a場,但如果對象不存在,不會創建領域bc

回答

1

Upserts可以使用修飾符;當需要創建新文檔時,修飾符會應用到選擇器/條件對象。請參閱here。但是,你需要設置upsert參數true在您的通話update

db.somecollection.update({x: 1}, {$inc: {x: 1}}, true); 

UPDATE

爲了得到你要找的行爲:

db.somecollection.update({_id: 12}, {$inc: {a: 1, b: 0, c: 0}}, true); 
+0

請看到我的編輯。對不起,沒有問一個完整的問題在第一個地方;( – m09

+0

@Mog見更新的答案。 – JohnnyHK

+0

聰明,謝謝!似乎有限雖然。我不明白爲什麼而不是布爾作爲第三個參數,對象不是如果有人需要正常更新,則爲null。無論如何... – m09