0

私はMongoDBでかなり難しいことが証明された何かを達成しようとしています。

私は2つのコレクションを持っています。1つは「マーカー」と呼ばれ、もう1つは「ルート」と呼ばれ、ユーザーがマーカー間に作成したルートを保持します。ルートコレクションには、[start_marker]と[end_marker]の2つの重要なフィールドがあります。これらのフィールドは、マーカーコレクション内のマーカーの_idです。

地図を閲覧するとき、アプリはマーカーコレクションに対して地理空間ボックスクエリを実行して、地図上のマーカーを見つけて表示します。

ユーザーがマーカーをクリックすると、バブルにマーカー名が表示されます。

名前の下には、私が問題を抱えている動的フィールドもあります。このフィールドは次のように表示されます。

  • マップ上で選択したマーカーからどのマーカーに誘導されたか
  • それらのマーカーが何回駆動されたか
  • マーカーに最も頻繁に駆動される3つだけが動的フィールドに表示されます

レコードコレクションには[start_marker]と[end_marker]_idsが記録されているため、[start_marker]フィールドで選択したマーカーの_idをレコードコレクションに照会します。

これにより、選択したマーカーが常に[start_marker]フィールドにある数百のドキュメントが生成されます。ここで、最も発生する[end_markers]を並べ替え、発生回数をカウントし、上位3つを選択し、それらの_idを取得して、マーカーコレクションにクエリを実行してマーカー名を抽出します。

問題は、カウントには、カウントするエンドマーカーフィールドを知る必要があり、そのため、それが発生する頻度を知る必要があります。キャッチ22。

エンドバブルの結果は次のようになります。

シティ1

シティ16-256回

シティ21-118回

シティ4-88回

Mongoはスキーマレスであるため、データベース構造を変更することはできます。カウントフィールドをどこかに追加することもできますが、現時点では完全に途方に暮れています。このクエリは1秒間に数百回発生するため、mapreduceはデータベースのパフォーマンスに悪影響を与える可能性があります。いくつかの入力をいただければ幸いです!

4

1 に答える 1

0

簡単な答えが見つかったと思います。

  1. 「ルート」と呼ばれる別のコレクションを作成します。
  2. [start_city]、[end_city]、[count]の3つのフィールドを追加します。
  3. ユーザーが「records」コレクションにドキュメントを作成するときは、「routes」コレクションにもドキュメントを作成します。
  4. [カウント]フィールドに1を追加します。
  5. 同じルートに新しいレコードが保存されるたびに、「routes」コレクションのカウントにさらに1を増やします。
  6. マップマーカーを表示するときは、「routes」コレクションで[start_marker]コレクションのmarker_idをクエリします。カウントで並べ替え、結果を3に制限します。
于 2013-01-31T10:35:53.300 に答える