GeoJSONオブジェクトを使用して場所を表すことができればもっと良いでしょうが、現時点ではサポートされるタイプは実際には制限されています そのため、理想的な「サークル」タイプはサポートされていません。
最も近いのは円を近似する「ポリゴン」ですが、これはおそらく、このクエリの目的のためだけに構築するには少し手間がかかりすぎます。これを実行してから$geoIntersects
結果は、クエリポイントからの距離で「ソート」されないということです。これは、「最も近いピザ」を原点に見つけるという目的とは逆のようです。
幸い、 $geoNear
があります。
MongoDB 2.4以降で、集約フレームワークに追加された操作。ここでの良い点は、結果に距離フィールドの「投影」ができることです。これにより、原点からの距離に対する「半径内」の制約にあるポイントに対して、サーバー上で論理フィルタリングを実行できます。サーバーでの並べ替えも可能です。
ただし、インデックスをサポートするには、スキーマを変更する必要があります
db.places.insert({
"name": "Pizza Hut",
"location": {
"type": "Point",
"coordinates": [
151.00211262702942,
-33.81696995135973
]
},
"radius": 20
})
db.places.ensureIndex({ "location": "2dsphere" })
集計クエリの場合:
db.places.aggregate([
// Query and project distance
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
150.92094898223877,
-33.77654333272719
]
},
"distanceField": "distance",
"distanceMultiplier": 0.001,
"maxDistance": 100000,
"spherical": true
}},
// Calculate if distance is within delivery sphere
{ "$project": {
"name": 1,
"location": 1,
"radius": 1,
"distance": 1,
"within": { "$gt": [ "$radius", "$distance" ] }
}},
// Filter any false results
{ "$match": { "within": true } },
// Sort by shortest distance from origin
{ "$sort": { "distance": -1 } }
])
基本的にこれは言う、
$geoNear
結果を絞り込み、必要に応じてデフォルトの100を超える結果を返し、基本的に「タイプ」や「名前」など、ドキュメントにあるその他の情報をクエリに渡すためです。