オリジナルよりもさらに最適で、 $expr
$match
内
最初の$geoNear
の後のステージ
:
db.collection.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
{ "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])
実際、最初に書いたときよりも少し最適です。これで、 $redact
を実行できます。
$project
ではなく
ブール値と$match
後で:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius and remove if not
{ "$redact": {
"$cond": {
"if": { "$lte": [ "$distance", "$radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
情報を正確に保存しましたが、結果を得るには思ったものとは異なるアプローチがあります。
使用したいのは$geoNear
具体的には、集約フレームワーク
その演算子の形式。これがあなたがすることです:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius
{ "$project": {
"location": 1,
"radius": 1,
"distance": 1,
"within": { "$lte": [ "$distance", "$radius" ] }
}},
// Match only documents within the radius
{ "$match": { "within": true } }
])
そのため、このフォームでは、クエリされたポイントからの距離を結果に「投影」できますが、クエリは最も近いドキュメントのみを返します。
次に、論理比較を使用して、「距離」の値が「半径」よりも小さいかどうか、つまり円内にあるかどうかを確認します。
最後に、その「範囲内」のアサーションが真である結果のみを除外するために一致します。
$geoNear
に他のオプションを追加できます ドキュメントに示されているように。また、ストレージでもGeoJSON形式を使用することを強くお勧めします。これは、取得した結果を処理するために使用する可能性のある他のライブラリとの互換性が高い可能性があるためです。