如何在国内最近的城市中使用 MongoDB 地理空间查询来搜索文档?
How to search documents with MongoDB geospatial queries within nearest cities in country?
假设用户在新西兰惠灵顿找到文档并提供惠灵顿市的坐标:lat: -41.2864603, lng: 174.77623600000004
。
但是如果这个城市没有文件,我需要在新西兰国家最近的城市搜索文件。
如何在国内找到文件?
大多数 "heavy lifting" 如果这真的是由一般地理空间查询本身完成的,只要您使用像 $near
or ideally $nearSphere
with a 2dsphere 索引这样的操作来考虑地球的曲率。此类查询基本上找到 "nearest" 指向所查询的 "point" 或提供的 GeoJSON 对象,并以这种方式对响应中的结果进行排序。
使用 geoNear 命令的原始实现在响应中默认 "limit" 100 个文档,并且能够设置响应中的文档限制。这通常仍然有效,因为您通常不希望从这样的查询中得到太多响应,因为有些地方根本就不是 "near"。
但一般情况是,如果您想在逻辑中添加其他查询参数,则只需将它们添加到现有查询即可:
db.collection.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
},
"$or": [
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
这里的逻辑是,查询的对象必须是 "near" 查询的位置数据,并且也有匹配 "Wellington" "city" 的数据 $or
匹配 "country" 共 "New Zealand"。
您可以替代地表示一个完整的 "or" 条件,其中对象不一定匹配地理位置条件,只要其他查询参数匹配某些内容即可:
db.collection.find({
"$or": [
{ "$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
}},
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
当然,如果你 "really want to" 因为一般来说不需要它,因为所选对象已经按 "nearest" 结果排序返回,还有其他方法 "bound" 那些结果在一定范围内 "distance"。但是如果你真的想指定额外的 "bounds" 那么你可以。
当然,当发出 $near
或 $nearSphere
查询或其他变体时,“2d”或“2dSphere”索引必须就位。另一个约束是数据必须以 legacy coordinate pairs or in GeoJSON format 的形式在文档中表示。在所有情况下,表示形式为 <longitude>
、<latitude>
.
因此,仅在文档中显示字段来表示 "longitude" 和 "latitude" 本身是不够的,您需要支持的存储格式以及 "index" 才能使用运算符如图所示。
条件中的其他数据可以包含在其他索引中,遵循带有和 $or
条件的查询选择指南,或者在复合索引中,只要该数据满足复杂性的规则可以组合。不需要对额外的数据字段进行索引,但通常是使用额外的查询参数进行查询的最佳方式。
假设用户在新西兰惠灵顿找到文档并提供惠灵顿市的坐标:lat: -41.2864603, lng: 174.77623600000004
。
但是如果这个城市没有文件,我需要在新西兰国家最近的城市搜索文件。
如何在国内找到文件?
大多数 "heavy lifting" 如果这真的是由一般地理空间查询本身完成的,只要您使用像 $near
or ideally $nearSphere
with a 2dsphere 索引这样的操作来考虑地球的曲率。此类查询基本上找到 "nearest" 指向所查询的 "point" 或提供的 GeoJSON 对象,并以这种方式对响应中的结果进行排序。
使用 geoNear 命令的原始实现在响应中默认 "limit" 100 个文档,并且能够设置响应中的文档限制。这通常仍然有效,因为您通常不希望从这样的查询中得到太多响应,因为有些地方根本就不是 "near"。
但一般情况是,如果您想在逻辑中添加其他查询参数,则只需将它们添加到现有查询即可:
db.collection.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
},
"$or": [
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
这里的逻辑是,查询的对象必须是 "near" 查询的位置数据,并且也有匹配 "Wellington" "city" 的数据 $or
匹配 "country" 共 "New Zealand"。
您可以替代地表示一个完整的 "or" 条件,其中对象不一定匹配地理位置条件,只要其他查询参数匹配某些内容即可:
db.collection.find({
"$or": [
{ "$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [ 174.77623600000004, -41.2864603 ]
}
}},
{ "city": "Wellington" },
{ "country": "New Zealand" }
]
})
当然,如果你 "really want to" 因为一般来说不需要它,因为所选对象已经按 "nearest" 结果排序返回,还有其他方法 "bound" 那些结果在一定范围内 "distance"。但是如果你真的想指定额外的 "bounds" 那么你可以。
当然,当发出 $near
或 $nearSphere
查询或其他变体时,“2d”或“2dSphere”索引必须就位。另一个约束是数据必须以 legacy coordinate pairs or in GeoJSON format 的形式在文档中表示。在所有情况下,表示形式为 <longitude>
、<latitude>
.
因此,仅在文档中显示字段来表示 "longitude" 和 "latitude" 本身是不够的,您需要支持的存储格式以及 "index" 才能使用运算符如图所示。
条件中的其他数据可以包含在其他索引中,遵循带有和 $or
条件的查询选择指南,或者在复合索引中,只要该数据满足复杂性的规则可以组合。不需要对额外的数据字段进行索引,但通常是使用额外的查询参数进行查询的最佳方式。