mongodb の geoNear コマンドを追加のクエリで使用して結果をフィルタリングすると、いくつかの問題に遭遇しました。次のクエリは rockmongo で作成されます。
私のコレクション「poi」では、ドキュメントにはオブジェクト ID を含む配列である「プロファイル」があります。それらを検索する場合:
{
geoNear : "poi",
near : [19,47],
query : {profiles : ObjectId("511f360901c610e813000004")}
}
結果が出ません。
Response from server: { "ns": "local.poi", "near": "1100010010100011101101101111001010100011101101101111", "results": [
], "stats": {
"time": NumberInt(2),
"btreelocs": NumberInt(0),
"nscanned": NumberInt(510),
"objectsLoaded": NumberInt(510),
"avgDistance": 0,
"maxDistance": 0 }, "ok": 1 }
ただし、クエリがなくても、単純な {profiles : ObjectId("511f360901c610e813000004")} クエリを使用しても、期待どおりの結果が得られます。
別の問題は、ドキュメントの約半分が「名前」が「x」で、残りの半分が「y」である場合です。
{
geoNear : "poi",
near : [47,19.5],
query : {"$and" : [{name : { "$in" : [/.*y.*/i]}}]}
}
単純な {"$and" : [{name : { "$in" : [/. y. /i]}}]} はそれらを提供します。実際、このサンプル クエリは非常に単純ですが、結果に違いはありません。これは、プロジェクトでの実際のクエリに似ています。
これらを PHP で試すと、追加のクエリが渡されても結果が得られるため、すべてのドキュメントが距離順に並べ替えられます。
私が間違っているかどうかを調べるのを手伝ってください。