sql >> Databasteknik >  >> NoSQL >> MongoDB

mongoose för att avgöra update-upsert gör infoga eller uppdatering

.update() metod i mongoose tar tre argument till återuppringningen, som är err , numAffected och en raw svar. Använd det "råa" objektet för att se vad som hände:

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

Du kommer att se en struktur så här:

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

Så det finns alltid n och 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id`-värden för alla nya dokument som skapats.

När det gäller n eller "antalAffected", detta är i princip alltid 1 där ett dokument matchades under de äldre skrivproblemsvaren.

Du kan se det nya WriteResult-svaret i MongoDB 2.6 och senare med hjälp av formuläret 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 vid en första iteration får du något sånt här:

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

Och en andra med samma parametrar så här:

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

Och dokumentet skulle bara markeras som "modifierat" där något faktiskt ändrades.

Så i alla fall .update() operationer returnerar inte det ändrade dokumentet eller originaldokumentet. Det är .findOneAndUpdate() metoden, en mungos omslag runt den grundläggande .findAndModify() som utför en atomoperation. .update() Metoder är vanligtvis avsedda för bulkoperationer och returnerar som sådana inte dokumentinnehåll.



  1. Hur uppdaterar man egenskapen i flera objekt i en array för ett dokument i Meteor collection/minimongo?

  2. Timeout utför SET {Key}, inst:0, mgr:Inaktiv, kö:2, qu=1, qs=1, qc=0, wr=1/1, in=0/0

  3. MongoDB - Fråga mellan ett tidsintervall på timmar

  4. mongodb sorteringsordning på _id