2012-12-11 47 views
3

我想使用updateupsert whiwle提供我自己的_id作爲關鍵。與upsert的mongodb更新:真正的行爲不如插入

事實證明,它只能當我使用insert,如果upsert:true提供有更新,新插入的文檔獲取蒙戈自動生成的id

參見下文:

PRIMARY> db.internal.update({_id: "my_id"},{ "value": "xyz"}, {upsert:true}) 
PRIMARY> db.internal.find() 
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" } 
PRIMARY> db.internal.insert({_id: "my_id2", "value": "xyz"}) 
PRIMARY> db.internal.find() 
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" } 
{ "_id" : "my_id2", "value" : "xyz" } 

這是一個功能或一個錯誤?

據我在Mongo's docs看,這應當制定

回答

7

是的,這是一個鮮爲人知的疑難雜症。訣竅是在upsert中使用$set修飾符。然後它會組合你的更新和查詢部分來形成插件文檔。看:

db.internal.update({_id: "my_id"},{"$set": {"value": "xyz"}}, {upsert:true}) 
db.internal.find() 
// { "_id" : "my_id", "value" : "xyz" } 
+0

你可以嘗試一下你的版本,看看它有什麼區別嗎? –

+0

查看已更新的回答 –

+0

很酷。請注意,這個{upsert:true}與true,對於遍佈網絡的用戶答案也是一個常見的錯誤。 –

0

剛剛發現,如果我再次在數據部分提供_id,除了條件部分,然後它的作品。

例如

PRIMARY> db.internal.update({_id: "my_id3"},{ _id: "my_id3", "value": "xyz"}, {upsert:true}) 
PRIMARY> db.internal.find() 
{ "_id" : ObjectId("50c6cbb21d8b512bc0fe9576"), "value" : "xyz" } 
{ "_id" : "my_id2", "value" : "xyz" } 
{ "_id" : "my_id3", "value" : "xyz" } 

然而,這不是看似是該API的目的 - 你可以在docs example其中{ _id:7 }查看正在與{ upsert:true }

db.bios.update(
   { 
     _id: 7, 
     name: { first: 'Ken', last: 'Thompson' } 
   }, 
   { 
     $set: { 
              birth: new Date('Feb 04, 1943'), 
              contribs: [ 'UNIX', 'C', 'B', 'UTF-8' ], 
              awards: [ 
                        { 
                          award: 'Turing Award', 
                          year: 1983, 
                          by: 'ACM' 
                        }, 
                        { 
                          award: 'IEEE Richard W. Hamming Medal', 
                          year: 1990, 
                          by: 'IEEE' 
                        }, 
                        { 
                          award: 'National Medal of Technology', 
                          year: 1998, 
                          by: 'United States' 
                        }, 
                        { 
                          award: 'Tsutomu Kanai Award', 
                          year: 1999, 
                          by: 'IEEE' 
                        }, 
                        { 
                          award: 'Japan Prize', 
                          year: 2011, 
                          by: 'The Japan Prize Foundation' 
                        } 
             ] 
           } 
   }, 
   { upsert: true } 
) 
0

一起提供。應該指出的是,沒有一個$組/ $ pull/etc。,修飾符,你只是用第二個參數替換文檔。

> db.test.update({_id: 'foo'}, {_id: 'foo', value: 'xyz'}, upsert=true) 
> db.test.find() 
{ "_id" : "foo", "value" : "xyz" } 
> db.test.update({_id: 'foo'}, {_id: 'foo', value: 'hello'}, upsert=true) 
> db.test.find() 
{ "_id" : "foo", "value" : "hello" } 
+0

'upsert = true' - 我認爲這純粹是偶然的。 –