公式の C# ドライバーを使用して、GeoNear を使用して MongoDB のコレクションをクエリしています。
ドキュメントは次のようになります。
{
"_id" : "1" ,
"Resource" : {
"_id" : "9",
"Type" : "AAA"
},
"Site" : {
"_id" : "4123" ,
"Location" : {
"Longitude" : 145.012345,
"Latitude" : -30.012345
}
}
}
多対多のシナリオでは、リソースとサイトの複数の組み合わせがあります。
geoNear は正常に機能していますが、他の基準で結果をフィルタリングする必要があります。
基本は機能しているので、たとえば、特定のリソース タイプをすべて返すことができますが、クエリがリソース タイプごとに最も近いドキュメントのみを返す必要があります。たとえば、10 のリソース タイプと数百のサイト (潜在的に数千の組み合わせ/ドキュメント) がある場合、クエリは最大 10 のドキュメントを返します...リソース タイプごとに 1 つずつ、それぞれに最も近いサイトを表示します (クエリは、実際には、クエリに指定した MaxDistance 内にそのリソース タイプのサイトがない場合は、それよりも少ない値を返します)
編集
私は C# ライブラリを使用しているため、LINQ を使用して結果をフィルター処理することでこれを回避することができますが、実装に依存せずに MongoDB でネイティブにこれを行う方法があるかどうかを確認することにまだ興味があります。
結果を MapReduce して目的を達成できると思いますが、GeoNear コマンドを使用してインラインでこれを行う方法がわかりません。中間コレクションを使用した 2 段階のプロセスを避けたいと思います (これらの結果のキャッシュはクエリは常に別のソースの場所から呼び出されるため、このインスタンスでは無関係です)