用于构建条件和的 MongoDB 聚合

Posted

技术标签:

【中文标题】用于构建条件和的 MongoDB 聚合【英文标题】:MongoDB Aggregation for building conditional sums 【发布时间】:2020-04-21 23:11:38 【问题描述】:

假设我的 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

【问题讨论】:

你能展示你的样本集吗 【参考方案1】:

你可以使用下面的聚合

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"
      
    ]
  
])

【讨论】:

以上是关于用于构建条件和的 MongoDB 聚合的主要内容,如果未能解决你的问题,请参考以下文章

mongodb聚合(转)

如何仅在特定条件下执行 MongoDB 聚合阶段之一?

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则

详细教程一文参透MongoDB聚合查询

MongoDB基础教程系列--第七篇 MongoDB 聚合管道