Tùy thuộc vào nhu cầu của hệ thống của bạn, tôi nghĩ rằng thiết kế mô hình có thể được đơn giản hóa bằng cách chỉ tạo một bộ sưu tập hợp nhất tất cả các thuộc tính trong collection1
và collection2
. Ví dụ:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var accountSchema = new Schema({
moneyPaid:{
type: Number
},
isBook: {
type: Boolean,
}
}, {collection: 'account'});
var Account = mongoose.model('Account', accountSchema);
trong đó bạn có thể chạy đường dẫn tổng hợp
var pipeline = [
{
"$match": { "isBook" : true }
},
{
"$group": {
"_id": null,
"total": { "$sum": "$moneyPaid"}
}
}
];
Account.aggregate(pipeline, function(err, results) {
if (err) throw err;
console.log(JSON.stringify(results, undefined, 4));
});
Tuy nhiên, với thiết kế giản đồ hiện tại, trước tiên bạn sẽ phải lấy id cho collection1 có giá trị true isBook trong collection2
và sau đó sử dụng danh sách id đó làm $match
truy vấn trong collection1
tổng hợp mô hình, giống như sau:
collection2Model.find({"isBook": true}).lean().exec(function (err, objs){
var ids = objs.map(function (o) { return o.coll_id; }),
pipeline = [
{
"$match": { "_id" : { "$in": ids } }
},
{
"$group": {
"_id": null,
"total": { "$sum": "$moneyPaid"}
}
}
];
collection1Model.aggregate(pipeline, function(err, results) {
if (err) throw err;
console.log(JSON.stringify(results, undefined, 4));
});
});