6

MongoDBの集約フレームワークで条件付きアンワインドをコーディングする方法があるかどうかを調べようとしています。

私はこのような集約コマンドを持っています:

models.Users.aggregate(
        {   // SELECT
        $project : { "sex" : 1,
                 "salesIndex":1
                }
        },
        {   // WHERE
            $match: {"salesIndex": {$gte: index}} 
        },              
        {   // GROUP BY y agregadores
            $group: {
                _id      : "$sex",
                sexCount : { $sum: 1 }
            }
        },
        { $sort: { sexCount: -1 } }
, function(err, dbres) {
         (...)
});

部門ごとにオプションのフィルターを追加したいのですが。ユーザーは1つ以上の部門に所属できます。これは、dbでどのように表示されるかを示しています。

user _id sex salesIndex部門{[d1、d2、d3]}

特定の部門のユーザーを検索する場合は、$ unwind句をコーディングしてから、部門ごとに$matchをコーディングします。ただし、両方のシナリオで同じ集計コマンドを使用したいのですが、次のようになります。

models.Users.aggregate(
        {   // SELECT
        $project : { "sex" : 1,
                 "salesIndex":1
                }
        },
        {   // WHERE
            $match: {"salesIndex": {$gte: index}} 
        },  

                    IF (filteringByDepartment){

                        $unwind departments here                            
                        $match by departmentId here
                    } 

        {   // GROUP BY y agregadores
            $group: {
                _id      : "$sex",
                sexCount : { $sum: 1 }
            }
        },
        { $sort: { sexCount: -1 } }
, function(err, dbres) {
         (...)
});

これはまったく可能ですか、それとも2つの集計コマンドが必要ですか?

4

1 に答える 1

10

呼び出す前に、プログラムで集約パイプラインを構築しますaggregate

var pipeline = [];
pipeline.push(
    {   // SELECT
    $project : { "sex" : 1,
             "salesIndex":1
            }
    },
    {   // WHERE
        $match: {"salesIndex": {$gte: index}}
    }
);
if (filteringByDepartment) {
    pipeline.push(
        { $unwind: '$departments' },
        { $match: { departments: departmentId }}
    );
}    
pipeline.push(
    {   // GROUP BY y agregadores
        $group: {
            _id      : "$sex",
            sexCount : { $sum: 1 }
        }
    },
    { $sort: { sexCount: -1 } }
);

models.Users.aggregate(pipeline, function(err, dbres) {
    //...
});
于 2012-12-12T13:40:37.487 に答える