0

現在、場所のリストのいずれかに住んでいるすべてのユーザーを見つけようとしています (この場所のリストは大きくなる可能性があるため、サーバー側のユニオンよりも複数のクエリを実行することは必ずしも理想的ではありません)。

たとえば、ユースケースは、現在の都市の任意の教会から 2 マイル以内に住んでいるすべてのユーザーを、それらの教会の座標のリストを指定して検索することです。

現在、次のロケーション クエリが機能します。

db.users.count( { location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2 / 3959  ] } } } )

としても:

db.users.count( {location : { $near : [ -84.330984 , 33.8615 ] , $maxDistance : 2 / 69 }  })

ただし、さまざまな場所に住んでいるユーザーの数を数えたいと思います。すなわち次のようなもの:

db.users.count( { $or: [{ location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2 / 3959  ] } } },{ location: { $within: { $centerSphere: [ [-85.331122, 34.97832], 2 / 3959  ] } } } ] } )

現在、このクエリを実行すると、Mongo は文書化されたエラーを返します。

Tue Mar 26 17:24:22 uncaught exception: count failed: {
"errmsg" : "exception: $or may not contain 'special' query",
"code" : 13291,
"ok" : 0
}

このエラーとオープンな JIRA チケット ( https://jira.mongodb.org/browse/SERVER-3984 ) から、Mongo は現在 $or (または $all) 演算子を使用して複数の場所のクエリを実行することが制限されているため、場所のクエリを連鎖させることはできません。

これを達成するためのベスト プラクティスまたは回避策はありますか? 繰り返しますが、場所ごとに個別のクエリを作成するのではなく、それらをマージすることをお勧めします。それが唯一の選択肢かもしれないことはわかっていますが。

私は現在 Mongo 2.2.3 を使用していますが、このジレンマが解決されるのであれば、2.4 にアップグレードしても問題はありません。

ありがとう

4

1 に答える 1

1

JavaScript に精通している場合は、mapReduce を使用してこれを実現できます。

ただし、$near と $centerSphere の 2 つのメソッドを構築する必要があり、1000 レコードを超える mapreduce を実行することはできません。

mongoDB は $or 演算子を制限しているため、これを解決するために頭をよぎった最初のアイデアです。

http://docs.mongodb.org/manual/applications/map-reduce/

于 2013-03-27T02:24:56.127 に答える