В зависимост от това какви са нуждите на вашата система, мисля, че дизайнът на модела може да бъде опростен чрез създаване само на една колекция, която обединява всички атрибути в collection1
и collection2
. Като пример:
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);
в който след това можете да стартирате тръбопровода за агрегиране
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));
});
Въпреки това, с настоящия дизайн на схемата ще трябва първо да получите идентификаторите за колекция1, които имат истинска стойност isBook в collection2
и след това използвайте този списък с идентификатори като $match
заявка в collection1
агрегиране на модели, нещо като следното:
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));
});
});