mongodb - MongoDB 按子组聚合已经按日期分组
问题描述
我有一个 mongo 集合,其中包含项目并像这样表示(小样本):
{
{
"_id" : ObjectId("5c615f9141d6ec562be9fd4d"),
"title" : "Project1",
"_created" : ISODate("2019-02-11T11:42:09Z"),
"org" : [
"ORG1"
]
}
{
"_id" : ObjectId("5cf4ec11362a5f02b74effd3"),
"title" : "Project2",
"org" : [
"ORG2"
],
"_created" : ISODate("2018-06-03T09:44:49Z")
}
{
"_id" : ObjectId("5d0362eb362a5f488a315508"),
"title" : "Another Project",
"org" : [
"ORG3"
],
"_created" : ISODate("2019-06-14T09:03:39Z")
}
{
"_id" : ObjectId("5d0362eb362a5f488a315508"),
"title" : "Multi Org Project",
"org" : [
"ORG1",
"ORG3"
],
"_created" : ISODate("2018-06-14T09:03:39Z")
}
}
我想做的是通过时间间隔(例如$day/$month/$year)知道在每个组织(org)中创建的项目数量。
我正在努力在 mongo 聚合中做到这一点。
我成功地做到了:
- 计算按年份创建的项目数量
db.projects.aggregate({$group:{_id:{$year: "$_created"}, project:{$sum:1}}})
- 统计 Org 创建的项目
db.projects.aggregate([{$unwind:"$org"}, {$group:{_id: "$org", project: {$sum:1}}}])
但是如何将两者结合起来?我不想强制任何结果格式,但他会是这样的:
{
2017: {
"ORG1": 12,
"ORG2": 3,
},
2018...
}
我发现了很多关于 MongoDB 聚合框架的问题,但我仍然不明白。
谢谢你的帮助!
解决方案
展开您的 org 数组,然后分组两次以实现此目的:
db.collection.aggregate([
{
$unwind: "$org"
},
{
$group: {
_id: {
year: {
$year: "$_created"
},
org: "$org"
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: "$_id.year",
res: {
$addToSet: {
org: "$_id.org",
count: "$count"
}
}
}
},
])
将输出
[
{
"_id": 2018,
"res": [
{
"count": 1,
"org": "ORG1"
},
{
"count": 1,
"org": "ORG3"
},
{
"count": 2,
"org": "ORG2"
}
]
},
{
"_id": 2019,
"res": [
{
"count": 1,
"org": "ORG2"
},
{
"count": 1,
"org": "ORG1"
},
{
"count": 1,
"org": "ORG3"
}
]
}
]
如果需要,您可以添加更多阶段来重塑您的文档。
推荐阅读
- php - Eloquent:如何按其他表中的列总和排序
- nativescript - 与团队分享 Nativescript 原型
- android - Android 使用 AsyncTask 通信不起作用
- c++ - 你如何找到 l 到 r 范围内所有整数的异或,其中 -(10^18) <= l,r <= 10^18?
- prolog - Prolog 试图找到其他解决方案,但我不知道为什么(只有一个)
- python - attrs 库和超级
- ssl - 在 Tomcat 7 应用程序上将 http 重定向到 https
- javascript - 如何使用 React Hooks 从子组件 onClick() 触发父组件中的事件?
- ios - 在启动时设置根视图控制器,具体取决于用户身份验证状态
- javascript - 等于 highcharts.js 中图形两侧的最大值