mongodb - 聚合 - 嵌套对象

时间:2018-01-27 18:24:59

标签: mongodb aggregation-framework spring-data-mongodb

我运行聚合函数以返回最喜欢的项目,如下所示:

db.users.aggregate(
    [
      { $unwind : "$favoriteItems" },
      { $group : { _id : "$favoriteItems" , number : { $sum : 1 } } },
      { $sort : { number : -1 } }
    ]
)

这是我的用户集合中的原型文档

{
  "_id": "5a68a9308117670afc3522cd",
  "username": "user1",
  "favoriteItems": {
    "5a0c6711fb3aac66aafe26c6": {
      "_id": "5a0c6711fb3aac66aafe26c6",
      "name": "item1",
    },
    "5a0c6b83fd3eb67969316dd7": {
      "_id": "5a0c6b83fd3eb67969316dd7",
      "name": "item2",
    },
    "5a0c6b83fd3eb67969316de4": {
      "_id": "5a0c6b83fd3eb67969316de4",
      "name": "item3"
    }
  }
}

但是,聚合函数将favoriteItems计为一个单项,并返回每个favoriteItems的计数,而不是favoriteItems中的元素。我在聚合函数中缺少什么?

1 个答案:

答案 0 :(得分:2)

您可以在3.4中尝试以下聚合。因此$unwind适用于不在文档上的数组。

因此,使用$objectToArray将对象转换为键值对的数组。

db.users.aggregate([
  {"$addFields":{"favoriteItems":{"$objectToArray":"$favoriteItems"}}},
  {"$unwind":"$favoriteItems"},
  {"$group":{"_id":"$favoriteItems.k","number":{"$sum":1}}},
  {"$sort":{"number":-1}}
])