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

mongoose for at bestemme update-upsert laver indsættelse eller opdatering

.update() metoden i mongoose tager tre argumenter til tilbagekaldet, nemlig err , numAffected , og en raw respons. Brug det "rå" objekt til at se, hvad der skete:

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

Du vil se en struktur som denne:

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

Så der er altid n og 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id` værdier for eventuelle nye dokumenter, der er oprettet.

Med hensyn til n eller "antalAffected", dette er stort set altid 1, hvor et dokument blev matchet under de ældre skrivebekymringssvar.

Du kan se det nye WriteResult-svar i MongoDB 2.6 og nyere ved at bruge formularen Bulk Operations:

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

Som ved en første iteration får du noget som dette:

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

Og et sekund med de samme parametre som denne:

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

Og dokumentet vil kun blive markeret som "modificeret", hvor noget rent faktisk blev ændret.

Så i hvert fald .update() handlinger returnerer ikke det ændrede dokument eller det originale dokument. Det er .findOneAndUpdate() metode, en mangust-indpakning omkring den grundlæggende .findAndModify() som udfører en atomoperation. .update() metoder er typisk beregnet til masseoperationer og returnerer som sådan ikke dokumentindhold.



  1. Forbind laravel jenssegers til mongodb atlas cluster

  2. Hvordan vælger man et enkelt felt til alle dokumenter i en MongoDB-samling?

  3. Hvordan installeres mongodb i Elastic Beanstalk?

  4. Mongoose indlejrede dokumenter / DocumentsArrays id