假设用户在新西兰惠灵顿找到文件并提供惠灵顿城市的坐标:lat: -41.2864603, lng: 174.77623600000004
。
但如果这个城市没有文件,我需要在新西兰国家内最近的城市内搜索文件。
我怎样才能在国内找到文件?
答案 0 :(得分:1)
大部分“繁重”如果这是由一般地理空间查询本身完成的,只要您使用$near
或理想$nearSphere
等2dsphere索引等操作允许地球的曲率。这样的查询基本上找到了所提供的查询“点”或GeoJSON对象的“最近”点,并以这种方式对结果进行排序。
使用geoNear命令的原始实现在响应中具有100个文档的默认“限制”,并且能够设置响应中的文档限制。这通常仍然有效,因为您通常不希望从这样的查询中得到太多响应,因为事情根本不是“接近”。
但一般情况是,如果您想在逻辑中添加其他查询参数,则可以将它们添加到现有查询中:
db.collection.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
},
"$or": [
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
逻辑是查询的对象必须“接近”查询的位置数据,并且还要匹配“惠灵顿”$or
的“城市”匹配“新西兰”的“国家”。 / p>
您可以交替表示一个完整的“或”条件,其中对象不一定与地理位置条件匹配,只要其他查询参数匹配某些内容:
db.collection.find({
"$or": [
{ "$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
}},
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
当然,如果您“真的想要”,因为一般来说不应该需要它,因为所选对象已经按“最近”结果排序,并且还有其他方法可以将这些结果“绑定”到内部一定的“距离”。但是如果你真的想要指定额外的“边界”,那么你可以。
当然,在发出$near
或$nearSphere
查询或其他变体时,必须有“2d”或“2dSphere”索引。另一个限制是数据必须以legacy coordinate pairs或GeoJSON format的形式在文档中表示。在所有情况下,表示形式为<longitude>
,<latitude>
。
因此,仅仅在文档中显示字段来表示“经度”和“纬度”本身是不够的,您需要支持的存储格式以及“索引”来使用所示的运算符。
条件中的其他数据可以包含在其他索引中,遵循使用和$or
条件选择查询的准则,或者在复合索引中,因为该数据符合可能的复杂性规则结合。没有必要对其他数据字段建立索引,但它通常是使用其他查询参数进行查询的最佳方式。