首页 > 解决方案 > Mongo Aggregate - 获取查询结果中出现多个值的次数

问题描述

我正在尝试计算两个单独字段为真的次数。我有两个值“clickedWouldRecommend”和“clickedWouldNotRecommend”。这些值也默认为 FALSE。在界面中单击按钮时,它们被设置为 TRUE。我试图查看每个 branch.name 有多少 clickedWouldRecommend = true 和多少 clickedWouldNotRecommend = true。

db.appointments.aggregate([
{
  $match: {
    $and: [
      {
        'branch.org_id': '100000'
      },
      { "analytics.clickedWouldRecommend": true },
      // Add OR statement to include analytics.clickedWouldNotRecommend = true?
    ]
  }
},
{
  $group: {
    _id: '$branch.name',
    wouldRecommend: { $sum: 1 }
  }
}
])

这提供了类似于以下的结果:

 {
  "_id": [ 'Clinic Name' ],
   "wouldRecommend": 115.0
 }

我需要修改查询以查找analytics.clickedWouldNotRecommend 设置为true 的情况。我正在尝试获得与此类似的输出(如果可能,还要注意从 _id 中删除数组):

 {
  "name": 'Clinic Name'
   "wouldRecommend": 115,
   "wouldNotRecommend": 10
 },
 {
  "name": 'Second Clinic Name'
   "wouldRecommend": 200,
   "wouldNotRecommend": 12
 }

这是截断的模型/架构:

      {
  branch: [
    {
      name: {
        type: String,
        required: true
      },
      clinic_id: {
        type: String,
        required: true
      },
      org_id: {
        type: String
      }
    }
  ],
  analytics: {
    clickedWouldRecommend: {
      type: Boolean,
      default: false
    },
    clickedWouldNotRecommend: {
      type: Boolean,
      default: false
    }
  },
  date: {
    type: Date,
    default: Date.now
  }
};

标签: node.jsmongodbmongoosemongodb-queryaggregation-framework

解决方案


您可以使用以下聚合

db.appointments.aggregate([
  { "$match": { "branch.org_id": "100000" }},
  { "$unwind": "$branch" },
  { "$facet": {
    "wouldRecommend": [
      { "$match": { "analytics.clickedWouldRecommend": true }},
      { "$group": { "_id": "$branch.name" }}
    ],
    "wouldNotRecommend": [
      { "$match": { "analytics.clickedWouldNotRecommend": true }},
      { "$group": { "_id": "$branch.name" }}
    ]
  }}
])

或者

db.appointments.aggregate([
  { "$match": { "branch.org_id": "100000" }},
  { "$unwind": "$branch" },
  { "$group": {
    "_id": "$branch.name",
    "wouldRecommend": {
      "$sum": {
        "$cond": [{ "$eq": ["$analytics.clickedWouldRecommend", true] }, 1, 0]
      }
    },
    "wouldNotRecommend": {
      "$sum": {
        "$cond": [{ "$eq": ["$analytics.clickedWouldRecommend", true]}, 1, 0]
      }
    }
  }}
])

推荐阅读