mongodb - MongoDB将过滤器与分组匹配并获取总数
问题描述
我的样本数据:
{
"_id": "random_id_1",
"priority": "P1",
"owners": ["user-1", "user-2"],
},
{
"_id": "random_id_2",
"priority": "P1",
"owners": ["user-1", "user-2"],
},
{
"_id": "random_id_3",
"priority": "P2",
"owners": ["user-1", "user-2"],
},
我想对涉及匹配过滤器和分组的数据运行聚合管道,我还想限制返回的组数以及每个组中的项目数。本质上,如果limit=2, limit_per_group=1, group_by=owner, priority=P1
,我想要以下结果:
[
{
"data": [
{
"group_key": "user-1",
"total_items_in_group": 2,
"limited_items": [
{
"_id": "random_id_1",
"priority": "P1",
"owners": ["user-1", "user-2"],
},
],
},
{
"group_key": "user-2",
"total_items_in_group": 2,
"limited_items": [
{
"_id": "random_id_1",
"priority": "P1",
"owners": ["user-1", "user-2"],
},
],
},
]
},
{
"metadata": {
"total_items_matched": 2,
"total_groups": 2
}
},
]
需要一些关于如何编写聚合管道以获得所需结果的帮助。我目前的查询如下:
{
"$match": {
"priority": "P1"
}
},
{
"$facet": {
"data": [
{
$addFields: {
"group_by_owners": "$owners"
}
},
{
$unwind: "$group_by_owners"
},
{
$group: {
"_id": "$group_by_owners",
"total_items_in_group": {
$sum: 1
},
"items": {
$push: "$$ROOT"
}
}
},
{
$sort: {
"total": -1
}
},
{
$unset: "items.group_by_owners"
},
{
$project: {
"_id": 1,
"total_items_in_group": 1,
"limited_items": {
$slice: [
"$items",
1
]
}
}
},
{
"$limit": 2
}
],
"metadata": [
{
$count: "total_items_matched"
}
]
}
}
Mongo playground 链接
我无法计算组的总数。
解决方案
$addfields
在管道末尾添加新阶段
db.collection.aggregate([
{
"$match": {
"priority": "P1"
}
},
{
"$facet": {
"data": [
{
$addFields: {
"group_by_owners": "$owners"
}
},
{
$unwind: "$group_by_owners"
},
{
$group: {
"_id": "$group_by_owners",
"total_items_in_group": {
$sum: 1
},
"items": {
$push: "$$ROOT"
}
}
},
{
$sort: {
"total": -1
}
},
{
$unset: "items.group_by_owners"
},
{
$project: {
"_id": 0,
"group_key": "$_id",
"total_items_in_group": 1,
"limited_items": {
$slice: [
"$items",
1
]
}
}
},
{
"$limit": 2
}
],
"metadata": [
{
$count: "total_items_matched",
}
]
}
},
{
"$addFields": {
"metadata.total_groups": {
"$size": "$data"
}
}
}
])
推荐阅读
- javascript - Javascript Diff算法不适用于HTML代码
- android - 我们可以在全局范围内添加@Suppress 标志吗?
- javascript - 使用 html2Canvas 和 jsPDF 保存为 PDF,用于 php 应用程序 1 次在 3 中工作
- python - configparser 不显示部分
- jquery - 已解决:如何在两种颜色之间切换
- c++ - MDIchild 中的 QWidget 问题 - QAbstractScrollArea
- vue.js - 如何在Vuejs中处理浏览器后退按钮单击事件
- sql - Postgres 不使用带有 LEFT JOIN 或 OR in where 的索引
- php - 从 debug_backtrace 动态提取参数
- haproxy - HAProxy 削减日志中的参数