sql >> Databáze >  >> NoSQL >> MongoDB

mongoose určit, zda update-upsert provádí vkládání nebo aktualizaci

.update() metoda v mongoose přebírá tři argumenty zpětného volání, a to err , numAffected a raw Odezva. Pomocí objektu "raw" se podívejte, co se stalo:

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

Uvidíte strukturu podobnou této:

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

Takže vždy existuje n a 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the hodnoty _id` všech nově vytvořených dokumentů.

Pokud jde o n nebo "numAffected", to je v zásadě vždy 1, pokud byl dokument porovnán pod staršími odpověďmi typu write.

Novou odpověď WriteResult v MongoDB 2.6 a vyšší můžete vidět pomocí formuláře Hromadné operace:

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

Což při první iteraci dostanete něco takového:

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

A druhý se stejnými parametry, jako je tento:

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

A dokument by byl označen jako „upravený“ pouze tam, kde bylo něco skutečně změněno.

Takže v každém případě .update() operace nevrátí upravený dokument ani původní dokument. To je .findOneAndUpdate() metoda, mangoose obal kolem základního .findAndModify() který provádí atomovou operaci. .update() metody jsou obvykle určeny pro hromadné operace a jako takové nevrací obsah dokumentu.



  1. Jak provést jednorázovou synchronizaci DB s jinou DB v MongoDB?

  2. MONGO dostanou pouze názvy dokumentů, ale ne celé dokumenty

  3. pymongo.errors.CursorNotFound:ID kurzoru '...' není na serveru platné

  4. MongoDB/NoSQL:Vedení historie změn dokumentů