gpt4 book ai didi

php - mongodb聚合框架按两个字段分组

转载 作者:IT老高 更新时间:2023-10-28 13:32:19 24 4
gpt4 key购买 nike

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

 $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 运算符吗?

最佳答案

您不能使用单个 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 字段,并在迭代结果时构建计数数组。

关于php - mongodb聚合框架按两个字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com