5

集計とパイプラインを使用してデータベースにクエリを実行しています。次の 2 つの個別のクエリを使用します。

 $groups_q = array(
            '$group' => array(
                '_id' => '$group_name',
                'total_sum' => array('$sum' => 1)
                )
            );

  $statuses_q = array(
            '$group' => array(
                '_id' => '$user_status',
                'total_sum' => array('$sum' => 1)
                )
            );

$data['statuses'] = $this->mongo_db->aggregate('users',$statuses_q);
$data['groups'] = $this->mongo_db->aggregate('users',$groups_q);

そして、私は欲しいものを手に入れています:

Array
(
[statuses] => Array
    (
        [result] => Array
            (
                [0] => Array
                    (
                        [_id] => Inactive
                        [total_sum] => 2
                    )

                [1] => Array
                    (
                        [_id] => Active
                        [total_sum] => 5
                    )

            )

        [ok] => 1
    )

[groups] => Array
    (
        [result] => Array
            (
                [0] => Array
                    (
                        [_id] => Accounting 
                        [total_sum] => 1
                    )

                [1] => Array
                    (
                        [_id] => Administrator
                        [total_sum] => 2
                    )

                [2] => Array
                    (
                        [_id] => Rep
                        [total_sum] => 1
                    )
            )

        [ok] => 1
    )

)

データベースに 2 回クエリを実行したくありません。それを行うより良い方法はありますか?1 つのクエリでそれを達成するにはどうすればよいですか? $project 演算子を使用する必要がありますか?

4

1 に答える 1

13

aggregate()目的の結果形式で 2 つのグループ化されたカウントを実行するために 1 つを使用することはできません。最初にデータがグループ化されると、2 番目のカウントを作成するために必要な詳細がなくなります。

簡単なアプローチは、すでに行っているように、2 つのクエリを実行することです ;-)。

代替案についての考え

本当に1 つの集計クエリで情報を取得したい場合は、両方のフィールドをグループ化してから、アプリケーション コードで何らかの操作を行うことができます。group に 2 つのフィールドがある_id場合、結果は group_name と status のすべての組み合わせになります。

mongoシェルを使用した例:

db.users.aggregate(
    { $group: {
         _id: { group_name: "$group_name", status: "$status" },
         'total_sum': { $sum: 1 }
    }}
)

これは特に効率的ではないように思われ、予想されるグループ化を得るために結果を 2 回反復する必要があるため、一部の複雑なアプリケーション コードに適しています。

名前とカウントではなく、各グループの一意の名前$addToSetのみが必要な場合は、単一のグループで使用できます。

もう 1 つの明白な代替方法は、アプリケーション コードでグループ化を行うことです。フィールドとフィールドのみを 1 回find()射影し、結果を繰り返しながらカウント配列を構築します。group_namestatus

于 2013-03-29T07:30:16.827 に答える