MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose, um festzustellen, ob update-upsert insert oder update durchführt

Der .update() -Methode in Mongoose nimmt drei Argumente für den Rückruf entgegen, nämlich err , der numAffected , und ein raw Antwort. Verwenden Sie das "rohe" Objekt, um zu sehen, was passiert ist:

Member.update({user_id : 1}, 
    {$set : {name:"name1"}}, 
    {upsert : true }, 
    function (err, numAffected, raw) {
    if (!err) {
        console.log(raw)
    }
});

Sie sehen eine Struktur wie diese:

{ ok: true,
  n: 1,
  updatedExisting: false,
  upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }

Es gibt also immer das n und 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id`-Werte aller neu erstellten Dokumente.

Wie bei n oder die "numAffected", dies ist im Grunde immer 1, wenn ein Dokument unter den Antworten auf ältere Schreibanliegen abgeglichen wurde.

Sie können die neue WriteResult-Antwort in MongoDB 2.6 und höher mithilfe des Formulars „Bulk Operations“ anzeigen:

var bulk = Member.collection.initializeOrderedBulkOp();
bulk.find({user_id : 1}.upsert().update({$set : {name:"name1"}});
bulk.execute(err,result) {
   console.log( JSON.stringify( result, undefined, 2 ) );
}

Bei einer ersten Iteration erhalten Sie etwa Folgendes:

{
  "ok": 1,
  "writeErrors": [],
  "writeConcernErrors": [],
  "nInserted": 0,
  "nUpserted": 1,
  "nMatched": 0,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": [
    {
      "index": 0,
      "_id": "5456fff138209001a6b5e1c0"
    }
  ]
}

Und eine zweite mit den gleichen Parametern wie folgt:

{
  "ok": 1,
  "writeErrors": [],
  "writeConcernErrors": [],
  "nInserted": 0,
  "nUpserted": 0,
  "nMatched": 1,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": []
}

Und das Dokument würde nur dort als "geändert" gekennzeichnet, wo tatsächlich etwas geändert wurde.

Also auf jeden Fall .update() Operationen geben weder das geänderte Dokument noch das Originaldokument zurück. Das ist .findOneAndUpdate() -Methode, ein Mungo-Wrapper um das grundlegende .findAndModify() die eine atomare Operation durchführt. Die .update() Methoden sind normalerweise für Massenoperationen gedacht und geben als solche keinen Dokumentinhalt zurück.