Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

ユーザープリファレンスデータによる集計

項目一覧

  • データモデル
  • 1 つのフィールドを返す
  • ドキュメントの正規化とソート
  • 結合月の順序でユーザー名を返す
  • 1 か月あたりの結合の合計数を返す
  • 最も一般的な 5 つの「タイプ」を返す

たとえば、メンバーの名前、参加日、スポーツの希望を追跡する 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"]
}
] )

次の操作では、 $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コレクションのすべてのドキュメントは、次の操作で構成される パイプラインを通過します。

  • $project演算子:

    • は、 nameという新しいフィールドを作成します。

    • は、 $toUpper演算子を使用して、 _idの値を大文字に変換します。 次に、 $projectはこの値を保持するためにnameという名前の新しいフィールドを作成します。

    • idフィールドを抑制します。 $projectは、明示的に非表示にされない限り、デフォルトで_idフィールドを渡します。

  • $sort演算子は、 nameフィールドで結果を順序付けます。

この操作では、次の結果を返します。

[
{ 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_joinedname

    • 結果から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 年の各月に参加したユーザー数を示しています。 この集計データは、採用やマーケティング戦略に使用できます。

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 件が収集されています。 このタイプの分析は、計画や将来の開発に情報を与える可能性があります。

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

戻る

郵便番号の例