只要您的 MongoDB 服务器足够新,是 2.6 或更高版本,那么此功能实际上已移至通用查询引擎。这里的 mongoose 方法包装了.runCommand()
表单被认为在所有未来版本中已弃用,因此只需使用附加运算符放置标准查询即可。
GeoLocation.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"$maxDistance": distanceInMeters
},
"loc.type": "Point"
},function(err,docs) {
// The documents are also mongoose document objects as well
});
查看更多选项$nearSphere http://docs.mongodb.org/manual/reference/operator/query/nearSphere/或其他选项的运算符。这里的主要区别是$maxDistance
使用 GeoJSON 形式时以米为单位,否则以弧度为单位。
当然还有$geoNear http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/聚合管道的运算符。从 MongoDB 2.4 开始可用,并且可以采用其他选项(例如“查询”)来进一步缩小结果范围。这里的另一个可能的优点是,它将一个字段“投影”到结果中,表示距查询点的“距离”。这可以用于其他计算或自定义排序:
GeoLocation.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"distanceField": "distance",
"maxDistance": distanceInMeters,
"spherical": true,
"query": { "loc.type": "Point" }
}},
{ "$sort": { "distance": -1 } } // Sort nearest first
],
function(err,docs) {
// These are not mongoose documents, but you can always cast them
}
);
其他需要注意的区别是,在标准查询形式中,结果不再像“命令”形式那样限制为 100 个文档。聚合$geoNear
默认情况下,结果限制为 100 个文档,但可以使用管道命令的附加“限制”选项来调整返回的文档数量。聚合语句不会对除搜索返回的最大文档之外的结果进行“排序”,这些结果是给定条件的顶部结果,但它们不会按顺序返回,因此您需要如图所示对它们进行排序。
在任何一种情况下,您都应该移动代码以使用这两种形式中的任何一种,因为命令形式已被视为已弃用,并将在将来被删除。猫鼬 API 是否保留其方法作为其中一种形式的“包装器”尚不清楚,但大多数可能性不大,因此最好坚持使用受支持的形式。