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 }