sql >> Base de Datos >  >> NoSQL >> MongoDB

mangosta para determinar update-upsert está insertando o actualizando

El .update() El método en mongoose toma tres argumentos para la devolución de llamada, siendo err , el numAffected , y un raw respuesta. Usa el objeto "sin procesar" para ver qué sucedió:

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

Verás una estructura como esta:

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

Así que siempre está el n y 'claves keys available, where the second is false on upserts and true otherwise. upsertedwill contain the Valores _id` de cualquier documento nuevo creado.

En cuanto a n o el "numAffected", esto es básicamente siempre 1 donde un documento coincidió con las respuestas de preocupación de escritura heredadas.

Puede ver la nueva respuesta de WriteResult en MongoDB 2.6 y superior usando el formulario de operaciones masivas:

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

Que en una primera iteración obtienes algo como esto:

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

Y un segundo con los mismos parámetros así:

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

Y el documento solo se marcaría como "modificado" cuando se cambiara algo.

Entonces, en cualquier caso, .update() operaciones no devuelven el documento modificado ni el documento original. Ese es el .findOneAndUpdate() método, un envoltorio de mangosta alrededor del .findAndModify() básico que realiza una operación atómica. El .update() los métodos suelen estar destinados a operaciones masivas y, como tales, no devuelven el contenido del documento.