このようなユーザーのコレクションがあるとしましょう:-
{
"_id" : "1234",
"Name" : "John",
"OS" : "5.1",
"Groups" : [{
"_id" : "A",
"Name" : "Group A"
}, {
"_id" : "C",
"Name" : "Group C"
}]
}
そして、私はこのようなイベントのコレクションを持っています:-
{
"_id" : "15342",
"Event" : "VIEW",
"UserId" : "1234"
}
「UserId」を発行してカウントオフできるので、mapreduceを使用してユーザーごとのイベントのカウントを計算できますが、ここで実行したいのは、グループごとにイベントをカウントすることです。
イベントドキュメントに「Groups」配列がある場合、これは簡単ですが、そうではありません。これは単なる例であり、実際のアプリケーションははるかに複雑であり、すべてのデータを複製したくありません。イベントドキュメントに。
http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/で例を見ましたが、値を集計しているため、この状況でどのように適用されるかわかりません。 2つの場所から...私が本当にやりたいのはルックアップを実行することだけです。
SQLでは、フラット化されたUserGroupテーブルをイベントテーブルに結合し、GROUPBYUserGroup.GroupNameだけを使用します。
mapreduceの複数のパスに満足しています...UserIdで{"_id": "1234"、 "count":9}のようなものにカウントする最初のパスですが、次のパスでスタックします...含める方法グループID
私が検討したいくつかの潜在的なアプローチ:-
- イベントドキュメントにグループ情報を含める(実行不可能)
- ユーザーコレクションに「参加」する方法、またはマップ関数内からユーザーグループを検索する方法を検討して、グループIDも発行できるようにします(これを行う方法がわかりません)。
- イベントとユーザーコレクションを「結合」して、mapreduceを実行できる3番目のコレクションにする方法を検討します
何が可能で、それぞれのアプローチの利点/問題は何ですか?