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

Актуализиране на препратка заедно с други стойности Mongoose

Данните тук се съдържат в различни колекции, така че нито един израз за актуализация не може да увеличи броячите и в двете едновременно.

За да получите последователен изглед, ще трябва да "свържете във верига" своите изрази за актуализиране и да използвате върнатите резултати от всеки, за да изградите отговора.

В зависимост от вашите нужди можете да използвате или Promise с това:

testSchema.statics.incrementTest = function(id) {
  var self = this;
  return new Promise(function(resolve,reject) {
    self.findByIdAndUpdate(
      id,
      {
        "$inc": {
          "points": 5,
          "numVotes": 1
        }
      },
      { "new": true }
    ).then(function(test) {
      var userModel = test.schema.path("userCreated").options.ref;
      mongoose.model(userModel).findByIdAndUpdate(
        test.userCreated,
        { "$inc": { "points": 5 } },
        { "new": true }
      ).then(function(user) {
        test.userCreated = user;
        resolve(test);
      })
    }).catch(reject)
  })
};

Което след това можете да извикате на вашия модел:

Test.incrementTest("56fe279d363ce91765d9e39e").then(function(test) {
    console.log(JSON.stringify(test,undefined,2));
}).catch(function(err) {
    throw err;
})

Или можете да използвате async.waterfall от async библиотека, ако това ви устройва повече:

testSchema.statics.incrementTest = function(id,callback) {
  var self = this;

  async.waterfall(
    [
      function(callback) {
        self.findByIdAndUpdate(
          id,
          { 
            "$inc": {
              "points": 5,
              "numVotes": 1
            }
          },
          { "new": true },
          callback
        )
      },
      function(err,test) {
        if (err) callback(err);
        var userModel = test.schema.path("userCreated").options.ref;
        mongoose.model(userModel).findByIdAndUpdate(
          test.userCreated,
          { "$inc": { "points": 5 } },
          { "new": true },
          function(err,user) {
            if ( typeof(user) !== "undefined" )
                test.userCreated = user;
            callback(err,test);
          }
        );
      }
    ],
    callback
  );
};

Което има подобна употреба:

Test.incrementTest("56fe279d363ce91765d9e39e",function(err,test) {
    if (err) throw err;
    console.log(JSON.stringify(test,undefined,2));
})

И двете трябва да ви върнат резултат, който показва увеличените данни в двата обекта и за двете колекции:

{ points: 5,
  numVotes: 1,
  __v: 0,
  userCreated: { points: 5, __v: 0, _id: 56ff1aa6dba6d13e798fc894 },
  createdAt: Sat Apr 02 2016 12:04:38 GMT+1100 (AEDT),
  updatedAt: Sat Apr 02 2016 12:04:38 GMT+1100 (AEDT),
  _id: 56fe279d363ce91765d9e39e }



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Препоръки относно структурата на Mongoid/MongoDB Tree of Tags

  2. MongoDB + Web App:База данни на потребител

  3. Можете ли да посочите ключ за $addToSet в Mongo?

  4. Често срещани въпроси за интервю за MongoDB

  5. mongodb c# изберете специфично поле точка нотация