是的,这是可能的。你只需使用$geoNear https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/反而。当心陷阱并仔细阅读。
假设您的意图是存储一个字段,例如"travelDistance"
在文档上表明任何此类搜索必须在所提供的距查询点的距离“范围内”才有效。然后我们简单地查询并评估条件$redact https://docs.mongodb.com/manual/reference/operator/aggregation/redact/:
db.collection.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [x,y]
},
"spherical": true,
"distanceField": "distance"
}},
{ "$redact": {
"$cond": {
"if": { "$lte": [ "$distance", "$travelDistance" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
唯一的问题是$geoNear https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/就像$near https://docs.mongodb.com/manual/reference/operator/query/near/首先只会返回“附近”的一定数量的文档。您可以使用选项进行调整,但与一般查询形式不同,这基本上保证最终返回的结果将小于指定的“最近”数字。
只要你意识到这一点,那么这就是完全正确的。
事实上,这是处理限定半径内“附近”的内容的一般方法。
另请注意根据坐标存储方式的“距离”。作为传统坐标对,距离将以弧度为单位,您可能需要进行数学计算才能将其转换为公里或英里。
如果使用 GeoJSON,则距离始终以米为单位,作为标准格式。
所有数学笔记都在文档中。
N.B阅读$geoNear https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/仔细记录。选项如"spherical"
需要用于"2dsphere"
索引,例如您应该拥有的现实世界坐标。还"limit"
可能需要应用以增加超过默认的 100 个文档结果,以便进一步修剪。
由于评论提到了 spring mongo,那么这里基本上做了同样的事情:
Aggregation aggregation = newAggregation(
new AggregationOperation() {
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return new BasicDBObject("$geoNear",
new BasicDBObject(
"near", new BasicDBObject(
"type","Point")
.append("coordinates", Arrays.asList(20,30))
)
.append("spherical",true)
.append("distanceField","distance")
);
}
},
new AggregationOperation() {
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return new BasicDBObject("$redact",
new BasicDBObject(
"$cond", Arrays.asList(
new BasicDBObject("$lte", Arrays.asList("$distance", "$travelDistance")),
"$$KEEP",
"$$PRUNE"
)
)
);
}
}
);