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

MongoDBの集計クエリでforEachを適用できますか?

    集約パイプラインではそれを行うことはできません。 MongoDB集約は、コレクションに適用される一連の特別な演算子であることを理解する必要があります。集計パイプラインを実行すると、MongoDBは演算子を相互にパイプします。つまり、演算子の出力は次の演算子の入力になります。各演算子の結果は、ドキュメントの新しいコレクションです。

    したがって、上記で達成しようとしていることは、最初にドキュメントの配列を作成する必要なしに、次のパイプラインとして簡単に書き直すことができます。

    var collection = db.collection('member'), 
        pipeline = [
            { "$match": { createdDate: currentDate, country: 'BD' } },
            {
                "$group": {
                    "_id": { "memberType": "$memberType", "country": "$country" },
                    "memberCount": { 
                        "$sum": { "$cond":[ { "$gt": ["$numberOfInvitees", 0] }, 1, 0 ] } 
                    },
                    "sameCount": { "$sum": 1 } 
                }
            }
        ];
    
    collection.aggregate(pipeline, function(err, result){
        if (err) throw err;
        console.log(result);
    });
    

    更新

    質問への変更のフォローアップとして、次の集計パイプラインを実行すると、目的の結果が得られます。

    var collection = db.collection('member'), 
        pipeline = [   
            { "$match": { createdDate: currentDate, country: 'BD' } },
            {
                "$group": {
                    "_id": { 
                        "memberType": "$memberType", 
                        "country": "$country" 
                    },            
                    "invitees":{ 
                        "$push":  {
                            "memberID": "$memberID",
                            "count": "$numberOfInvitees"
                        }
                    },
                    "inviteesList": { "$push": "$numberOfInvitees" },
                    "memberCount": { "$sum": 1 } 
                }
            },
            { "$unwind": "$invitees" },
            { "$unwind": "$inviteesList" },
            { 
                "$group": {
                    "_id": "$invitees.memberID",
                    "sameInviteesCount": { 
                         "$sum": { 
                            "$cond": [ 
                                { "$eq": ["$inviteesList", "$invitees.count"] }, 
                                1, 0 
                            ] 
                        }
                    },
                    "lessInviteesCount": { 
                        "$sum": { 
                            "$cond":[ 
                                { "$lt": ["$inviteesList", "$invitees.count"] }, 
                                1, 0 
                            ] 
                        }
                    },
                    "memberCount": { "$first": "$memberCount" }
                }
            }
        ];
    
    collection.aggregate(pipeline, function(err, result){
        if (err) throw err;
        console.log(result);
    });
    



    1. mongoDBエラー:エラー:[localhost:27017]への接続に失敗しました

    2. MongoDBとSQLデータベースの違い

    3. Windowsでmongodbを起動する方法

    4. redis + gevent-パフォーマンスが悪い-何が間違っているのですか?