首页 > 解决方案 > 用于构建条件和的 MongoDB 聚合

问题描述

假设我的 MongoDB 中有一些用户文档。每个用户都有一个type(int) 和presencedays (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}}

标签: mongodbmongoosemongodb-querynosqlaggregation-framework

解决方案


您可以使用以下聚合

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

推荐阅读