2017-09-03 199 views
1

我有一個3列的表:名稱,年齡,tm。如何使用mongodb-insert-on-duplicate-key-update?

它有(姓名,年齡)的化合物指數

如果使用的MySQL,SQL可能是這樣的:

insert into tt(name,age,tm) values('chenlong', 29, 1504437683) on duplicate key update tm = 1504437683 

如何在MongoDB中使用?

db.tt.find() 

{ "_id" : ObjectId("59abe43ade8616599017a085"), "name" : "chenlong", "age" : 29, "tm" : ISODate("2017-09-03T11:32:04.156Z") } 

    db.tt.update(
     {name:'chenlong',age:29}, 
     { 
      $set: {tm:ISODate()}, 
      $setOnInsert: {tm:ISODate()} 
     }, 
     { upsert: true } 
    ) 

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

    db.tt.find() 

{ "_id" : ObjectId("59abe43ade8616599017a085"), "name" : "chenlong", "age" : 29, "tm" : ISODate("2017-09-03T11:33:09.359Z") } 

沒關係,列tm變得更新,但添加了新記錄,發生了錯誤。

db.tt.update(
    {name:'chenlong',age:30}, 
    { 
     $set: {tm:ISODate()}, 
     $setOnInsert: {tm:ISODate()} 
    }, 
    { upsert: true } 
) 

WriteResult({ 
     "nMatched" : 0, 
     "nUpserted" : 0, 
     "nModified" : 0, 
     "writeError" : { 
       "code" : 16836, 
       "errmsg" : "**Cannot update 'tm' and 'tm' at the same time**" 
     } 
}) 

如何解決問題?謝謝。

+0

您不能使用兩個不同的運算符修改相同的路徑。另外你正在嘗試沒有任何意義。 '$ set'將會發生在「更新」匹配以及「upsert/insert」上。 '$ setOnInsert'的意義在於你只有**在'upsert/insert'實際發生時纔會寫入的值。所以,如果你有'$ setOnInsert:{created:ISODate()}',那麼這會更有意義,因爲它是一個獨立的屬性,只有在創建「新」文檔時才需要寫入。對於「修改」時間,只需使用'$ set' ** **。不需要其他陳述。 –

+0

非常感謝。然後我刪除$ setOnInsert部分,它運作良好。 – zxsz4084

回答

0

這將工作

db.tt.update(
    {name:'chenlong',age:30}, 
    { 
     $set: {tm:ISODate()}  
    }, 
    { upsert: true } 
) 

如果文件相匹配,將更新或更新插入會發生。