sql >> データベース >  >> NoSQL >> MongoDB

他の値と一緒に参照を更新するマングース

    ここのデータは異なるコレクションに含まれているため、単一の更新ステートメントで両方のカウンターを同時にインクリメントすることはできません。

    一貫性のあるビューを取得するには、更新ステートメントを「チェーン」し、それぞれの戻り結果を使用して応答を作成する必要があります。

    ニーズに応じて、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. Reg:クエリごとにmongodbの出力が間違っています

    2. Mongodb phpは新しいドキュメントのIDを取得しますか?

    3. redis pub/subで切断された接続から回復する

    4. Meteor他のユーザーにメールで問い合わせる