Още по-оптимално от оригинала, сега можете да използвате $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, тъй като той вероятно ще бъде по-съвместим с всички други библиотеки, които можете да използвате, за да работите върху получените резултати.