MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mangusta per determinare update-upsert sta eseguendo l'inserimento o l'aggiornamento

Il .update() metodo in mongoose accetta tre argomenti per la richiamata, essendo err , il numAffected e un raw risposta. Usa l'oggetto "grezzo" per vedere cosa è successo:

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

Vedrai una struttura come questa:

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

Quindi c'è sempre il n e 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id` valori di tutti i nuovi documenti creati.

Come per n o "numAffected", questo è fondamentalmente sempre 1 in cui un documento è stato confrontato con le risposte ai problemi di scrittura legacy.

Puoi vedere la nuova risposta WriteResult in MongoDB 2.6 e versioni successive utilizzando il modulo Operazioni in blocco:

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

Che su una prima iterazione ottieni qualcosa del genere:

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

E un secondo con gli stessi parametri come questo:

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

E il documento verrebbe contrassegnato come "modificato" solo quando qualcosa è stato effettivamente modificato.

Quindi, in ogni caso, .update() operazioni non restituiscono il documento modificato o il documento originale. Questo è il .findOneAndUpdate() metodo, un wrapper mangusta attorno al .findAndModify() di base che esegue un'operazione atomica. Il .update() i metodi sono in genere pensati per operazioni in blocco e come tali non restituiscono il contenuto del documento.