MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

mongoose, за да определи, че update-upsert прави вмъкване или актуализиране

.update() методът в mongoose приема три аргумента за обратното извикване, като err , numAffected и raw отговор. Използвайте "суровия" обект, за да видите какво се е случило:

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

Ще видите структура като тази:

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

Така че винаги има n и 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id` стойности на всички създадени нови документи.

Що се отнася до n или „numAffected“, това всъщност винаги е 1, когато документът е съпоставен в отговорите за загриженост за наследено писане.

Можете да видите новия отговор WriteResult в MongoDB 2.6 и по-нова версия, като използвате формуляра за групови операции:

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

Което при първа итерация ще получите нещо подобно:

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

И втори със същите параметри като този:

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

И документът ще бъде маркиран като „модифициран“ само там, където нещо действително е било променено.

Така че във всеки случай, .update() операциите не връщат модифицирания документ или оригиналния документ. Това е .findOneAndUpdate() метод, mongoose обвивка около основния .findAndModify() който извършва атомарна операция. .update() методите обикновено са предназначени за групови операции и като такива не връщат съдържание на документ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Актуализиране на масив в MongoDB с помощта на Java драйвер

  2. Как да получа статус на връзката в C# MongoDB драйвер v2.0?

  3. Как да направя вмъкване, ако не съществува друго актуализация с mongoengine?

  4. Пролетна персонализирана заявка с възможност за страници

  5. Как да актуализирам всички документи в mongodb PHP