mongodb - 用于构建条件和的 MongoDB 聚合
问题描述
假设我的 MongoDB 中有一些用户文档。每个用户都有一个type
(int) 和presence
days (boolean)。
我的文档架构
{
type: NumberInt() // 1|2|3
presence: {
day1: true,
day2: false,
day3: true
}
我想计算每种类型用户的出现天数,以便在折线图中可视化他们的出现。所需的输出必须看起来像这样。表示类型的数组中的三个对象。每个对象都有系列。它们代表在指定日期出现的特定类型用户的总和。
想要的结果
[{
name: "Type1"
series: [{
name: "Day1",
value: 5, // count (type==1 && d1==true)
}, {
name: "Day2",
value: 8, // count (type==1 && d2==true)
}, {
name: "Day3",
...
}]
}, {
name: "Type2"
series: [{
name: "Day1",
value: 10, // count (type==2 && d1==true)
}, {}, {}]
}, {
name: "Type3"
series: [{}, {}, {}]
}, {
name: "AllCombined"
series: [{}, {}, {}]
}]
问题
我怎样才能通过 mongodb 聚合来实现呢?我玩过$match
, $sort
, $project
,$sum
但我无法弄清楚。提前致谢 :)
要求的样本:用户收藏
{_id: ..., type: 1, presence: {d1:true, d2: true, d3: false}}
{_id: ..., type: 2, presence: {d1:false, d2: true, d3: false}}
{_id: ..., type: 3, presence: {d1:true, d2: false, d3: true}}
{_id: ..., type: 1, presence: {d1:true, d2: false, d3: false}}
解决方案
您可以使用以下聚合
db.collection.aggregate([
{ "$group": {
"_id": "$type",
"d1": { "$sum": { "$cond": [{ "$eq": ["$presence.d1", true] }, 1, 0] }},
"d2": { "$sum": { "$cond": [{ "$eq": ["$presence.d2", true] }, 1, 0] }},
"d3": { "$sum": { "$cond": [{ "$eq": ["$presence.d3", true] }, 1, 0] }}
}},
{ "$project": {
"_id": 0,
"name": { "$concat": ["Type", { "$toString": "$_id" }] },
"series": [
{
"name": "Day1",
"value": "$d1"
},
{
"name": "Day2",
"value": "$d2"
},
{
"name": "Day3",
"value": "$d3"
}
]
}}
])
推荐阅读
- apostrophe-cms - ApostropheCMS - 为什么在管理栏中提交更改时收到错误消息?
- r - 在 purrr::map_dfr() 中使用 data.table 函数时,“eval 中的错误(bysub,x,parent.frame()):找不到对象 '.x'”
- mysql - 存储在 Mysql 中的 Node.js App Datetime 早于 UTC 时间
- algorithm - 项目在网格上的可重复随机放置
- javascript - EJS 模板不呈现任何数据
- c# - 如何基于涉及第一个元素的谓词转换可观察对象
- python - GluonCV - 量化姿态估计/目标检测模型
- ios - 拉动刷新顶部的白色间隙
- arrays - 交换数组的部分
- javascript - React 应用程序在 Google App Engine 上运行时抛出 Uncaught SyntaxError: Unexpected token '<'