sql >> Database >  >> NoSQL >> MongoDB

Referentie bijwerken samen met andere waarden Mongoose

De gegevens hier bevinden zich in verschillende verzamelingen, dus geen enkele update-instructie kan tellers in beide tegelijk verhogen.

Om een ​​consistent beeld te krijgen, moet u uw update-statements "ketenen" en de geretourneerde resultaten van elk gebruiken om het antwoord op te bouwen.

Afhankelijk van uw behoeften kunt u ofwel een Promise . gebruiken hiermee:

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

Die u vervolgens op uw model kunt aanroepen:

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

Of u kunt async.waterfall . gebruiken van de async bibliotheek als dat beter bij je past:

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

Die een soortgelijk gebruik heeft:

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

Beide zouden u een resultaat moeten geven dat de verhoogde gegevens in beide objecten voor beide collecties toont:

{ 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. Binnen een mongodb $match, hoe te testen op veld MATCHING , in plaats van veld EQUALING

  2. Hoe AppArmor configureren voor MongoDB-replicasets?

  3. Waarom worden gegevens opgeslagen met rare sleutels in Redis bij gebruik van Jedis met Spring Data?

  4. Maak een 2dsphere Geospatial Index voor sferische zoekopdrachten in MongoDB