使用mongoose,mongodb搜索最常见的“数据”

时间:2013-09-06 14:13:33

标签: node.js mongodb mongoose aggregation-framework

我的结构。

User: 
{
  name: "One",
  favoriteWorkouts: [ids of workouts],
  workouts: [ { name: "My workout 1" },...]
}

我想从数据库中获取偏好/最热门锻炼列表。

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

返回

{
    "hot": [
    {
       "_id": "521f6c27145c5d515f000006",
       "number": 1
    },
    {
       "_id": "521f6c2f145c5d515f000007",
       "number": 1
    },...
]}

但我想要

{
   hot: [
   {object of hottest workout 1, object of hottest workout 2,...}
]}

如何对最热门的数据进行排序并使用对象填充结果,而不只是ids?

1 个答案:

答案 0 :(得分:1)

想要使用MongoDB的聚合框架是正确的。如果使用正确,聚合将为您提供所需的输出。如果您只想查找所有用户最喜欢的锻炼的_id列表,那么我相信您需要在管道中添加额外的$ group操作:

db.users.aggregate(
    { $unwind : "$favoriteWorkouts" },
    { $group : { _id : "$favoriteWorkouts", number : { $sum : 1 } } },
    { $sort : { number : -1 } },
    { $group : { _id : "oneDocumentWithWorkoutArray", hot : { $push : "$_id" } } }  
)

这将产生以下形式的文件,其中锻炼ID按受欢迎程度列出:

{
    "_id" : "oneDocumentWithWorkoutArray",
    "hot" : [
        "workout6",
        "workout1",
        "workout5",
        "workout4",
        "workout3",
        "workout2"
    ]
}