按嵌套对象键的Mongodb聚合计数

按嵌套对象键的Mongodb聚合计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我想数一数获得了多少第一、第二等成绩,我事先不知道成绩的名称。我只想把第一阶段的所有成绩都计算在内。我如何使用聚合来计算这些数据?我看到另一个问题建议使用“展开”,但这似乎只适用于数组而不适用于对象? 创意 将对象转换为数组 放松,让他们分开 按id分组,添加1表示真,添加0表示假 db.artists.insertMany([ { "_id" : 1, "achievements" : {"third_record":true,

我想数一数获得了多少第一、第二等成绩,我事先不知道成绩的名称。我只想把第一阶段的所有成绩都计算在内。我如何使用聚合来计算这些数据?我看到另一个问题建议使用“展开”,但这似乎只适用于数组而不适用于对象?

创意

  • 将对象转换为数组
  • 放松,让他们分开
  • 按id分组,添加1表示真,添加0表示假
  • 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} },
    ])
    
    db.collection.aggregate([
      {
        $project: {
          as: {
            $objectToArray: "$achievements"
          }
        }
      },
      {
        $unwind: "$as"
      },
      {
        $group: {
          _id: "$as.k",
          number: {
            $sum: {
              "$cond": [
                {
                  $eq: [
                    "$as.v",
                    true
                  ]
                },
                1,
                0
              ]
            }
          }
        }
      }
    ])