mongodb-聚合-嵌套对象

mongodb-聚合-嵌套对象,mongodb,aggregation-framework,spring-data-mongodb,Mongodb,Aggregation Framework,Spring Data Mongodb,我运行聚合函数返回最喜欢的项,如下所示: db.users.aggregate( [ { $unwind : "$favoriteItems" }, { $group : { _id : "$favoriteItems" , number : { $sum : 1 } } }, { $sort : { number : -1 } } ] ) 这是我的用户收藏中的一个原型文档 { "_id": "5a68a9308117670afc3522

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

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中的元素。聚合函数中缺少了什么?

您可以在3.4中的聚合下面进行尝试。因此,在数组上工作,而不是在文档上工作

因此,使用将对象转换为键值对数组

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

您可以在3.4中尝试下面的聚合。因此,在数组上工作,而不是在文档上工作

因此,使用将对象转换为键值对数组

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

非常感谢解决方案我解决了一个小的逻辑问题,它成功了。再次非常感谢你。我有一个问题:addFields是改变了数据库还是仅仅改变了用于处理文档的缓冲区。没有聚合不会改变数据库。非常感谢解决方案,我修复了一个小的逻辑问题,它成功了。再次非常感谢你。我有一个问题:addFields是改变了数据库还是仅仅改变了用于处理文档的缓冲区。没有聚合不会改变数据库。