Mongodb 当前文档字段值内的地理空间$near
以这个查询为例:Mongodb 当前文档字段值内的地理空间$near,mongodb,mongodb-query,aggregation-framework,geospatial,spring-mongodb,Mongodb,Mongodb Query,Aggregation Framework,Geospatial,Spring Mongodb,以这个查询为例: { 'location' : { '$near' : [x,y], '$maxDistance' : this.field } } 我想为$maxDistance指定当前评估文档中指定字段的值。可能吗 是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读 假设您的目的是存储一个字段,如“travelDistance”,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件: 唯一的问题是,like首先只返回一定数量的“
{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }
我想为$maxDistance指定当前评估文档中指定字段的值。可能吗 是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读 假设您的目的是存储一个字段,如
“travelDistance”
,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件:
唯一的问题是,like首先只返回一定数量的“near”文档。您可以使用选项对此进行调整,但与常规查询表单不同,这基本上保证了最终返回的结果将小于指定的“最近”数字
只要你意识到这一点,那么这是完全正确的
事实上,这是处理限定半径内“接近”的事物的一般方法
根据坐标的存储方式,还要注意“距离”。作为传统坐标对,距离将以弧度为单位,您可能需要进行数学运算以转换为公里或英里
如果使用GeoJSON,则作为标准格式,距离始终以米为单位
所有的数学笔记都在文档中
N.B仔细阅读文档。“2dsphere”
索引需要像“sphere”
这样的选项,比如真实世界坐标的选项。此外,可能需要应用“限制”以增加超过默认的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"
)
)
);
}
}
);
是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读 假设您的目的是存储一个字段,如
“travelDistance”
,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件:
唯一的问题是,like首先只返回一定数量的“near”文档。您可以使用选项对此进行调整,但与常规查询表单不同,这基本上保证了最终返回的结果将小于指定的“最近”数字
只要你意识到这一点,那么这是完全正确的
事实上,这是处理限定半径内“接近”的事物的一般方法
根据坐标的存储方式,还要注意“距离”。作为传统坐标对,距离将以弧度为单位,您可能需要进行数学运算以转换为公里或英里
如果使用GeoJSON,则作为标准格式,距离始终以米为单位
所有的数学笔记都在文档中
N.B仔细阅读文档。“2dsphere”
索引需要像“sphere”
这样的选项,比如真实世界坐标的选项。此外,可能需要应用“限制”以增加超过默认的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"
)
)
);
}
}
);
不,这是不可能的。你不是第一个问这个问题的人:)@SergioTulentsev那么你读错了帖子。这已经有一段时间了。NeilLunn:好吧,这个确切的需求可以用另一种方式来满足,但是一般问题(“我可以在查询中使用文档的字段吗?”)的答案仍然是“不”。@SergioTulentsev不,一般的答案是使用
$redact
或者更糟的$where
。一直都是。不,这是不可能的。你不是第一个问这个问题的人:)@SergioTulentsev那么你读错了帖子。这已经有一段时间了。NeilLunn:好吧,这个确切的需求可以用另一种方式来满足,但是一般问题(“我可以在查询中使用文档的字段吗?”)的答案仍然是“不”。@SergioTulentsev不,一般的答案是使用$redact
或者更糟的$where
。一直都是,很有效,谢谢。但我现在有另一个问题,因为我使用的是SpringDataMongoDB框架,它仍然不支持$redact:(@LiLou_u)它可能没有“helper”方法,但您始终可以使用DBObject input将自己的pipeline stage实现为一个抽象。关于这一点,在这个网站上有几个答案。我知道,因为我已经写了其中的一些。@LiLou_u添加了Spring Data Mongo的翻译,并在问题上包含了标记。如您所见,添加自定义pipeline stage和语句相当简单le.此聚合将不适用于$near
?$geoNear
是否需要?@LiLou$geoNear
是$near
的“聚合”版本。您需要聚合和$geoNear
返回“距离”比较一下。你没有失去任何东西。如果你当时还不明白的话。它是有效的,谢谢。但我现在有另一个问题,因为我使用的是Spring Data Mongodb框架,它仍然不支持$redact:(@LiLou_u它可能没有“helper”方法,但您始终可以使用DBObject input将自己的pipeline stage实现为一个抽象。关于这一点,在这个网站上有几个答案。我知道,因为我已经写了其中的一些。@LiLou_u添加了Spring Data Mongo的翻译,并在问题上包含了标记。如您所见,添加自定义pipeline stage和语句相当简单le.此聚合将不适用于$near
?$geoNear
是否需要?@LiLou$geoNear
是$near
的“聚合”版本