2017-05-26 2 views
0

私はコレクションを持っています。各ドキュメントにはuser_idsがプロパティとして格納されています。これはArrayフィールドです。例の文書(複数)は次のようになります。mongoアグリゲーションフレームワークを使用するユーザー1人あたりのデータを集計します

[{ 
    _id: 'i3oi1u31o2yi12o3i1', 
    unique_prop: 33, 
    prop1: 'some string value', 
    prop2: 212, 
    user_ids: [1, 2, 3 ,4] 
}, 
{ 
    _id: 'i3oi1u88ffdfi12o3i1', 
    unique_prop: 34, 
    prop1: 'some string value', 
    prop2: 216, 
    user_ids: [2, 3 ,4] 
}, 
{ 
    _id: 'i3oi1u8834432ddsda12o3i1', 
    unique_prop: 35, 
    prop1: 'some string value', 
    prop2: 211, 
    user_ids: [2] 
}] 

私の目標は、ユーザーごとの文書の数を取得するので、サンプル出力は次のようになります。私が働いていたいずれも物事のカップルを試してみた

[ 
{user_id: 1, count: 1}, 
{user_id: 2, count: 3}, 
{user_id: 3, count: 2}, 
{user_id: 4, count: 2} 
] 

最後に、私は試しました:

aggregate([ 
    { $group: { 
    _id: { unique_prop: "$unique_prop"}, 
    users: { "$addToSet": "$user_ids" }, 
    count: { "$sum": 1 } 
    }} 
] 

ただドキュメントごとにユーザーを返しました。私はまだどんなリソースや助言が助けることを学ぶことを試みています。

答えて

2

$unwindの "user_ids"配列と、$group個のステージカウントで、各 "id"がコレクションに表示される回数が必要です。

db.collection.aggregate([ 
    { "$unwind": "$user_ids" }, 
    { "$group": { "_id": "$user_ids", "count": {"$sum": 1 }}} 
]) 
+0

ありがとうございます!これはきれいです! – Mongoid

0

MongoDBアグリゲーションは、コレクション内のドキュメントから値のグループを計算し、そのステージをパイプラインで実行することで計算結果を返します。

上記の説明に従えば、MongoDBシェルで以下の集約クエリを実行してみてください。上記集計クエリで

db.collection.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $unwind: "$user_ids" 
     }, 

     // Stage 2 
     { 
      $group: { 
       _id:{user_id:'$user_ids'}, 
       total:{$sum:1} 
      } 
     }, 

     // Stage 3 
     { 
      $project: { 
       _id:0, 
       user_id:'$_id.user_id', 
       count:'$total' 
      } 
     }, 

    ] 


); 

最初$リラックスオペレータは、複数のアレイ・フィールドの各要素のドキュメントと各文書に含まuser_idsフィールドの値によってそれグループ文書に各文書のアレイフィールドuser_idsを破るとの加算を行いますuser_idsフィールドの各値のドキュメント。

関連する問題