ユーザープリファレンスデータによる集計
データモデル
たとえば、メンバーの名前、参加日、スポーツの希望を追跡する members
コレクションを持つスポーツ チーム データベースを考えてみましょう。
db.members.insertMany( [ { _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] }, { _id: "joe", joined: ISODate("2012-07-02"), likes: ["tennis", "golf", "swimming"] }, { _id: "ruth", joined: ISODate("2012-01-14"), likes: ["golf", "racquetball"] }, { _id: "harold", joined: ISODate("2012-01-21"), likes: ["handball", "golf", "racquetball"] }, { _id: "kate", joined: ISODate("2012-01-14"), likes: ["swimming", "tennis"] } ] )
1 つのフィールドを返す
次の操作では、 $project
を使用して、 members
コレクション内のすべてのドキュメントの_id
フィールドのみを返します。
db.members.aggregate( [ { $project: { _id: 1 } } ] )
この操作により、次のドキュメントが返されます。
[ { _id: 'jane' }, { _id: 'joe' }, { _id: 'ruth' }, { _id: 'harold' }, { _id: 'kate' } ]
基本的なクエリとプロジェクション操作では、 find()
メソッドを使用した標準クエリが最高のパフォーマンスを発揮します。
ドキュメントの正規化とソート
次の操作は、大文字でアルファベット順のメンバー名を返します。 処理のためにメンバー名を正規化するために、これを行うことができます。
db.members.aggregate( [ { $project: { name: { $toUpper: "$_id" }, _id: 0 } }, { $sort: { name: 1 } } ] )
members
コレクションのすべてのドキュメントは、次の操作で構成される パイプラインを通過します。
この操作では、次の結果を返します。
[ { name: 'HAROLD' }, { name: 'JANE' }, { name: 'JOE' }, { name: 'KATE' }, { name: 'RUTH' } ]
結合月の順序でユーザー名を返す
次の集計操作では、参加した月順に並べ替えられたメンバー名が返されます。 この集計を使用して、メンバーシップ更新通知の生成に役立ちます。
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" }, name: "$_id", _id: 0 } }, { $sort: { month_joined: 1 } } ] )
パイプラインは、 members
コレクション内のすべてのドキュメントを次の操作を通じて渡します。
$project
演算子:次の 2 つの新しいフィールドを作成します:
month_joined
とname
。結果から
id
を非表示にします。aggregate()
メソッドには、明示的に非表示にされていない限り、_id
が含まれます。
$month
演算子は、joined
フィールドの値を月の整数表現に変換します。 次に、$project
演算子がそれらの値をmonth_joined
フィールドに割り当てます。$sort
演算子は結果をmonth_joined
フィールドでソートします。
この操作では、次の結果を返します。
[ { month_joined: 1, name: 'ruth' }, { month_joined: 1, name: 'harold' }, { month_joined: 1, name: 'kate' }, { month_joined: 3, name: 'jane' }, { month_joined: 7, name: 'joe' } ]
1 か月あたりの結合の合計数を返す
次の操作は、1 年の各月に参加したユーザー数を示しています。 この集計データは、採用やマーケティング戦略に使用できます。
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" } } } , { $group: { _id: { month_joined: "$month_joined" } , number: { $sum: 1 } } }, { $sort: { "_id.month_joined": 1 } } ] )
パイプラインは、 members
コレクション内のすべてのドキュメントを次の操作を通じて渡します。
$project
演算子はmonth_joined
という新しいフィールドを作成します。$month
演算子は、joined
フィールドの値を月の整数表現に変換します。 次に、$project
演算子が値をmonth_joined
フィールドに割り当てます。$group
演算子は、特定のmonth_joined
値を持つすべてのドキュメントを収集し、その値のドキュメントがある数をカウントします。 具体的には、一意の 値ごとに、$group
は 2 つのフィールドを含む新しい「月ごと」ドキュメントを作成します。_id
は、month_joined
フィールドとその値を持つネストされたドキュメントを含みます。number
は、生成されたフィールドです。$sum
演算子は、指定されたmonth_joined
値を含むドキュメントごとに、このフィールドを 1 インクリメントします。
$sort
演算子は、month_joined
フィールドの内容に従って、$group
が作成したドキュメントをソートします。
集計操作により、次のドキュメントが返されます。
[ { _id: { month_joined: 1 }, number: 3 }, { _id: { month_joined: 3 }, number: 1 }, { _id: { month_joined: 7 }, number: 1 } ]
最も一般的な 5 つの「タイプ」を返す
次の集計では、データセット内の最も「好み」のアクティビティの上位 5 件が収集されています。 このタイプの分析は、計画や将来の開発に情報を与える可能性があります。
db.members.aggregate( [ { $unwind: "$likes" }, { $group: { _id: "$likes" , number: { $sum: 1 } } }, { $sort: { number: -1 } }, { $limit: 5 } ] )
パイプラインはmembers
コレクション内のすべてのドキュメントから始まり、これらのドキュメントを次の操作を通じて渡します。
$unwind
演算子はlikes
配列内の各値を分離し、配列内のすべての要素に対して新しいバージョンのソース ドキュメントを作成します。例
members
コレクションの次のドキュメントがあるとします。{ _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] } $unwind
演算子は次のドキュメントを出力します。{ _id: "jane", joined: ISODate("2011-03-02"), likes: "golf" } { _id: "jane", joined: ISODate("2011-03-02"), likes: "racquetball" } $group
演算子は、likes
フィールドの同じ値を持つすべてのドキュメントを収集し、各グループをカウントします。 この情報を使用して、$group
は 2 つのフィールドを含む新しいドキュメントを作成します。_id
、これにはlikes
値が含まれます。number
は、生成されたフィールドです。$sum
演算子は、指定されたlikes
値を含むドキュメントごとに、このフィールドを 1 インクリメントします。
$sort
演算子は、これらのドキュメントをnumber
フィールドで逆の順序でソートします。$limit
演算子には最初の 5 つの結果ドキュメントのみが含まれます。
集計操作により、次のドキュメントが返されます。
[ { _id: 'golf', number: 4 }, { _id: 'racquetball', number: 3 }, { _id: 'tennis', number: 2 }, { _id: 'swimming', number: 2 }, { _id: 'handball', number: 1 } ]