0

私の構造。

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,...}
]}

最もホットなデータを並べ替えて、ID だけでなくオブジェクトで結果を埋めるにはどうすればよいでしょうか?

4

1 に答える 1

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"
    ]
}
于 2013-09-18T19:27:07.570 に答える