MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation Mongodb avec 2 collections

Selon les besoins de votre système, je pense que la conception du modèle pourrait être simplifiée en créant une seule collection qui fusionne tous les attributs dans collection1 et collection2 . Par exemple :

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

dans lequel vous pouvez ensuite exécuter le pipeline d'agrégation

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

Cependant, avec la conception de schéma actuelle, vous devez d'abord obtenir les identifiants de collection1 qui ont la valeur isBook true dans collection2 puis utilisez cette liste d'identifiants comme $match requête dans la collection1 modèle d'agrégation, quelque chose comme ceci :

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