2017-09-03 1 views
1

Ich habe eine Tabelle mit 3 Spalten: Name, Alter, tm.Wie mongodb-insert-on-duplicate-key-update verwenden?

Es hat eine Verbindung Index (Name, Alter)

Wenn die Verwendung von MySQL, SQL, wie dies auch sein mag:

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

Wie in mongodb benutzen?

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") } 

Es ist okay, Spalte tm werden neuer, aber fügen Sie einen neuen Datensatz, Fehler passiert.

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**" 
     } 
}) 

So lösen Sie das Problem? Vielen Dank.

+0

Sie können den gleichen Pfad nicht mit zwei verschiedenen Operatoren ändern. Auch was du versuchst, ergibt keinen Sinn. Das '$ set' wird bei einem" update "-Match sowie bei einem" upsert/insert "passieren. Der Punkt von '$ setOnInsert' ist für Werte, die Sie ** nur ** schreiben wollen, wenn" upsert/insert "tatsächlich passiert. Wenn Sie also '$ setOnInsert: {created: ISODate()}' haben, wäre das sinnvoller, da es sich um eine separate Eigenschaft handelt, die nur geschrieben werden muss, wenn ein "neues" Dokument erstellt wird. Für eine "modifizierte" Zeit verwenden Sie einfach "$ set" ** nur **. Keine Notwendigkeit für die andere Aussage. –

+0

Vielen Dank. Dann lösche ich $ setOnInsert Teil, es funktioniert gut. – zxsz4084

Antwort

0

wird diese Arbeit

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

Wenn Dokument es passt aktualisieren oder Upsert auftreten.