0

公式の 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 段階のプロセスを避けたいと思います (これらの結果のキャッシュはクエリは常に別のソースの場所から呼び出されるため、このインスタンスでは無関係です)

4

1 に答える 1

0

地理クエリを使用する場合、MongoDB に n 個の最も近い結果を返すように指示できます。また、MongoDB にいくつかの追加フィールド (「タイプ」フィールドなど) もチェックするように指示できます。

しかし、私が知る限り、その追加フィールドの異なる値ごとに最も近い一致を返すように指示することはできません。MongoDB シェルを使用してそのようなクエリを発行する方法を見つけた場合は、それを C# に変換するお手伝いをします。

「タイプ」ごとにクエリを1回繰り返すだけでよいと思います。最も近い一致のみに関心がある場合は、ドキュメントの制限を1に設定します。

于 2012-06-14T19:25:25.823 に答える