2017-02-24 6 views
0

私はバックエンド側でNodeJSとMongodbを使ってFoursquare APIを使って作業しています。私はすべてのユーザー情報とチェックイン履歴をコレクションに保存しています。したがって、コレクションは次のようになります。Mongodbのコレクション内の配列からグループ化された結果を抽出する方法

{ 
    _id: ..., 
    foursquareId: ... 
    personalInfo: {}, 
    checkins: [ 
     { 
      id: ..., 
      createdAt: 123456789 //Seconds since epoch>, 
      venue: {}, 
      ... 
     }, 
     { 
      id: ..., 
      createdAt: 123456789 //Seconds since epoch>, 
      venue: {}, 
      ... 
     }, 
     ... 
    ] 
} 

この質問では、私はチェックイン配列にのみ興味があります。私は毎月チェックインの数量のリストを返す必要がありますが、私はこれに接近するための最善の方法はわかりません。 (私も完全に納得していないよ)

{ 
    '2016': { 
     'January': 43, 
     'February': 38, 
     'March': 40, 
     'April': 48, 
     'May': 50, 
     'June': 41, 
     'July': 39, 
     'August': 38, 
     'September': 30, 
     'October': 29, 
     'November': 38, 
     'December': 41 
    }, 
    '2017': { 
     'January': 55, 
     'February': 20 
    } 
} 

私はフロントエンドに関する情報を受け取る方法について興味がありません:私は、結果はこのようなものになるだろうと思います。 私はmongodbでこれを行うことが可能かどうかを知りたいのですが、ドキュメントや他の例でこれを行う方法が見つからなかったからです。それ以外の場合は、フロントエンドで行う必要があるかもしれません(いい考えではありません。

答えて

1

集約フレームワークを使用すると、必要なものを得ることができます。

db.collectionName.aggregate([ 
{$unwind:'$checkins'}, 
{ 
    $project: { 
     id: 1, 
     'checkins.createdAt' : 1, 
     newDate : { 
      $add : [ new Date(0), { 
       $multiply : [ "$checkins.createdAt", 1000 ] 
      }] 
     } 
    } 
}, 
{$project : { 
    year: {$year: "$newDate"}, 
    month: {$month: "$newDate"} 
}}, 
{$group: {_id:{year:"$year", month:"$month"}, count:{$sum:1}}}, 
{$group: {_id:{year:"$_id.year"}, monthTotals: { $push: { month: "$_id.month", count: "$count" } }}} 
]) 

これは、次のようなドキュメントを生成します。

{ 
    "_id" : { 
     "year" : NumberInt(2016) 
    }, 
    "monthTotals" : [ 
     {"month" : NumberInt(1),"count" : NumberInt(2)} 
     {"month" : NumberInt(2),"count" : NumberInt(3)} 
    ] 
} 

第二段階(最初の$プロジェクト・ステップ)がエポック値から、あなたの日付が格納されている方法に応じて調整する必要があるかもしれませんが、これは取得する必要がありますあなたは一般的にあなたが必要なものです。

結果の後処理を行わずに概説したようにデータを正確に取得する方法はありませんが、結果を変更するだけの簡単さが必要です。

+0

ありがとう@anztenney。これは確かに行く方法です。変わったことが日付で起こっています(文字列として保存されていますが、その場でparseIntを使用する際に問題があります)が、私はこれを自分で処理します。 – newpatriks

+0

あなたが助けを必要とする場合は、ここにコメントを書いてください。 – anztenney

関連する問題