0

MongoDB と Map/Reduce を使用して、ユーザーのサイト訪問を人口統計別にグループ化する良い方法を見つけようとしています。次のコレクションがあります。

サイト訪問 - 例:

{
    userId: '184792',
    resource: '/example/foo',
    visitTime: ISODate(...)
}

ユーザー プロファイル - 例:

{
    userId: '184792',
    demo: '18-30',
    city: 'Austin',
    state: 'TX',
    ...
}

日別または月別のサイト訪問数を示すレポートを作成したいと考えていました。ただし、サイト訪問で Map/Reduce を実行すると、人口統計情報ではなく userId にしかアクセスできないため、人口統計に基づいてキーを発行する方法がありません。実際、State などのユーザー属性でグループ化する場合、それも不可能です。

MongoDB でこの問題を解決するベスト プラクティスの方法を知っている人はいますか? すべてのサイト訪問ドキュメントですべてのユーザー属性を複製する必要がありますか? 複数のクエリを使用してコレクションに参加できるアプリケーション コード内で何らかのタイプの再削減を行う必要がありますか? それとも、この種の問題を解決するために間違ったツールを使用しているだけですか?

提案をありがとう。

4

2 に答える 2

0

出力オプションを使用してreduce、実質的に 2 つのマップ削減結果を一緒にマージできます。

{ reduce : "collectionName" } - 結果セットと古いコレクションに特定のキーのドキュメントが存在する場合、(指定された reduce 関数を使用して) 2 つの値に対して reduce 操作が実行され、結果が次の場所に書き込まれます。出力コレクション。finalize 関数が提供されている場合、これは reduce の後にも実行されます。

両方のコレクションを共通の形式にマップする必要があります。これにより、ソース マップされた各ドキュメントから 1 つのドキュメントに作用し、それぞれの適切なフィールドをマージするこの縮小ステップを実行できます。

例については、このブログ エントリを参照してください。

于 2012-06-07T19:41:48.293 に答える
0

ここには 3 つの解決策があります。

  1. 人口統計データをサイト訪問数に非正規化します。
  2. 「クライアント側」の Map/Reduce を実行します。つまり、訪問をループし、適切なユーザー プロファイルをロードしてから、概要コレクションを更新するスクリプトを作成します。
  3. このためのリアルタイム カウンターを保持します。

MongoDB でこの問題を解決するベスト プラクティスの方法を知っている人はいますか?

MongoDB の場合、答えは通常「場合による」です。そして、この場合、それは本当にそうです。

考慮すべきいくつかの質問:

  • 訪問のたびにプロファイル データを調べていますか?
  • データを「リアルタイム」にしたいですか?
  • 予想されるすべてのロールアップを事前に把握していますか?
  • すべてのトランザクション データを保存したいですか、それともロールアップだけに関心がありますか?

通常、ここでの解決策は 1 と 3 の組み合わせです。

取引データと「柔軟な」レポートが必要な場合は、訪問ごとにプロファイル データを保持する必要があります。

主なレポートが事前にわかっている場合は、何らかの形式のカウンターを使用して、トランザクションを書き込むと同時にこれらに書き込むことをお勧めします。つまり、基本的にレポート データ セットをオンザフライで作成します。はい、それはより多くの書き込みですが、MongoDB は多くの書き込みを行うこのパターンを好みます。

于 2012-06-07T19:29:41.933 に答える