Mongodb 按嵌套对象键聚合计数

时间:2020-12-30 01:37:38

标签: mongodb aggregation-framework

db.artists.insertMany([
  { "_id" : 1, "achievements" : {"third_record":true, "second_record": true} },
  { "_id" : 3, "achievements" : {"sixth_record":true, "second_record": true} },
  { "_id" : 2, "achievements" : {"first_record":true, "fifth_record": true} },
  { "_id" : 4, "achievements" : {"first_record":true, "second_record": true} },
])

我想统计一下获得了多少个first_record、second_record等成就,我事先不知道成就的名字。我只是想让它统计第一阶段匹配的所有成就。我如何使用聚合来计算这个?我看到另一个问题建议使用 unwind 但这似乎仅适用于数组而不适用于对象?

1 个答案:

答案 0 :(得分:1)

May be this:

db.collection.aggregate([
  {
    $project: {
      as: {
        $objectToArray: "$achievements"
      }
    }
  },
  {
    $unwind: "$as"
  },
  {
    $group: {
      _id: "$as.k",
      number: {
        $sum: {
          "$cond": [
            {
              $eq: [
                "$as.v",
                true
              ]
            },
            1,
            0
          ]
        }
      }
    }
  }
])

想法

  1. 将对象转换为数组
  2. 放松,让他们分开
  3. 按 id 分组,真加 1,假加 0。
相关问题