2017-09-14 21 views
0

た後、私はこの集計を持っている:モンゴDB集約保つのフィールドはグループ

[ 
    { 
     $match: {_id: new ObjectId('xxx')} 
    }, 
    { 
     $unwind: "$users" 
    }, 
    { 
     $group: { 
      _id: '$users.status', 
      count: {$sum: 1} 
     } 
    }, 
    { 
     $project: { 
      name: 1, 
      field1: 1, 
      field2: 1, 
      count: '$count' 
     } 
    } 
] 

スキーマ:

{ 
    name: String, 
    field1: String, 
    field2: Schema.Types.Mixed, 
    users: [{ 
     user: { 
      type: Schema.Types.ObjectId, 
      ref: 'User' 
     }, 
     status: String 
    }] 
} 

期待される結果:

{ 
    name: 'NY', 
    field1: 'example', 
    field2: 'example2', 
    statuses: [ 
     { 
      _id: 'ONLINE', 
      count: 20 
     }, 
     { 
      _id: 'OFFLINE', 
      count: 120 
     }, 
     { 
      _id: 'OTHER', 
      count: 230 
     } 
    ] 
} 

私はグループの結果だけを取得します。この方法元のオブジェクトの他のフィールドには適用されません。

+1

よう

何かはあなたが正確に必要なものについてもう少し説明を追加してくださいすることができますか? – mrid

+0

コレクションのドキュメントの例と、出力の表示方法を教えてください。 – robjwilkins

+0

確か:私は都市の名前と他のデータ、そしてユーザーの配列を持つ市の文書を持っています。私はすべてのフィールドを投影し、ユーザーステータス別にグループ化して投影したい。 – user3712353

答えて

0

$firstを使用してフィールドを保持し、$pushを使用してstatusesアレイを作成します。

$group_idあなたのマッチに単一のobjectIdが含まれている場合、キーはオプションです。

[ 
    { 
    "$match": { 
     "_id": {_id: new ObjectId('xxx')} 
    } 
    }, 
    { 
    "$unwind": "$users" 
    }, 
    { 
    "$group": { 
     "_id": { 
     "_id": "$_id", 
     "status": "$users.status" 
     }, 
     "count": { 
     "$sum": 1 
     }, 
     "field1": { 
     "$first": "$field" 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": "$_id._id", 
     "statuses": { 
     "$push": { 
      "_id": "$_id.status", 
      "count": "$count" 
     } 
     }, 
     "field1": { 
     "$first": "$field" 
     } 
    } 
    } 
]