【问题标题】:mongodb aggregation framework group by two fieldsmongodb聚合框架按两个字段分组
【发布时间】:2013-03-19 18:34:58
【问题描述】:

我正在使用聚合和管道查询我的数据库,其中有两个单独的查询:

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

)

我不想查询我的数据库两次。有更好的方法吗? 如何通过一个查询完成它?我应该使用 $project 运算符吗?

【问题讨论】:

  • 您在这里查询两个不同的集合吗?你能解释一下你想要做什么吗?
  • 我正在查询同一个集合,并按两个不同的字段(状态和 group_name)对其进行分组。我试图获得与我提供的相同的结果,即按组组合和按状态分别组合,但在一个查询中。
  • 我认为这需要两个查询

标签: php codeigniter mongodb mongodb-php mongodb-query


【解决方案1】:

您不能使用单个aggregate() 以您想要的结果格式进行两次分组计数。数据第一次分组后,您将不再拥有创建第二次计数所需的详细信息。

直接的方法是执行两个查询,就像您已经在做的那样;-)。

对替代方案的思考

如果您真的想在一个聚合查询中获取信息,您可以对这两个字段进行分组,然后在您的应用程序代码中进行一些操作。在组 _id 中有两个字段,结果将是 group_name 和 status 的每个组合。

使用mongo shell 的示例:

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

这似乎不是特别有效,并且适用于一些复杂的应用程序代码,因为您必须对结果进行两次迭代才能获得预期的分组。

如果您只想要每个组的唯一 名称 而不是名称 + 计数,您可以在单个组中使用 $addToSet

另一个明显的选择是在您的应用程序代码中进行分组。执行单个 find() 仅投影 group_namestatus 字段,并在迭代结果时构建计数数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多