sql >> データベース >  >> NoSQL >> MongoDB

2つのコレクションを持つMongodbアグリゲーション

    システムのニーズによっては、collection1のすべての属性をマージするコレクションを1つだけ作成することで、モデルの設計を簡素化できると思います。 および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));
    });
    

    ただし、現在のスキーマ設計では、最初にcollection2にisBooktrue値を持つcollection1のIDを取得する必要があります。 次に、そのIDリストを $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));
        });
    });
    



    1. django-nonrelとmongodbを使用してカスタムクエリを作成する方法

    2. ユーザーのIDとしてmongoObjectIdを使用するのは悪い習慣ですか?

    3. Facebook-JWTを使用したパスポート

    4. Firebase関数からMongoDBAtlasに接続する