MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mangouste pour déterminer update-upsert fait une insertion ou une mise à jour

Le .update() La méthode dans la mangouste prend trois arguments pour le rappel, à savoir err , le numAffected , et un raw réponse. Utilisez l'objet "raw" pour voir ce qui s'est passé :

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

Vous verrez une structure comme celle-ci :

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

Il y a donc toujours le n et 'updatedExistingkeys available, where the second is false on upserts and true otherwise. mis à jourwill contain the _id` valeurs de tout nouveau document créé.

Comme pour n ou le "numAffected", c'est fondamentalement toujours 1 lorsqu'un document a été mis en correspondance sous les réponses de préoccupation d'écriture héritées.

Vous pouvez voir la nouvelle réponse WriteResult dans MongoDB 2.6 et versions ultérieures à l'aide du formulaire d'opérations en masse :

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

Ce qui, lors d'une première itération, vous obtenez quelque chose comme ceci :

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

Et un second avec les mêmes paramètres comme ceci :

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

Et le document ne serait marqué comme "modifié" que là où quelque chose a été réellement changé.

Donc dans tous les cas, .update() les opérations ne renvoient pas le document modifié ou le document d'origine. C'est le .findOneAndUpdate() méthode, un wrapper mangouste autour de la base .findAndModify() qui effectue une opération atomique. Le .update() Les méthodes sont généralement destinées aux opérations en masse et, en tant que telles, ne renvoient pas le contenu du document.