MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cập nhật tài liệu tham khảo cùng với các giá trị khác Mongoose

Dữ liệu ở đây được chứa trong các bộ sưu tập khác nhau, vì vậy không có câu lệnh cập nhật nào có thể tăng bộ đếm trong cả hai cùng một lúc.

Để có được một cái nhìn nhất quán, bạn sẽ cần phải "xâu chuỗi" các câu lệnh cập nhật của mình và sử dụng kết quả trả về của mỗi câu lệnh để xây dựng phản hồi.

Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng Promise với cái này:

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

Sau đó, bạn có thể gọi cái nào trên mô hình của mình:

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

Hoặc bạn có thể sử dụng async.waterfall từ async thư viện nếu phù hợp với bạn hơn:

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

Cái nào có cách sử dụng tương tự:

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

Cả hai sẽ trả lại cho bạn một kết quả hiển thị dữ liệu gia tăng trong cả hai đối tượng cho cả hai bộ sưu tập:

{ 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. Đặt giới hạn cho bộ sưu tập db mongo

  2. Thực thi ánh xạ kiểu với mgo

  3. Bộ giải mã MongoDB BSON không được sử dụng khi mã hóa đối tượng

  4. Nhân bản một bộ sưu tập mongodb

  5. Kiểm tra xem trình điều khiển PHP MongoDB đã được cài đặt chưa