看起来 mongodb 为地理空间查询提供了两个类似的功能 -$near
和$geoNear
. 根据 mongo 文档
geoNear 命令提供了 $near 运算符的替代方法。除了 $near 的功能之外,geoNear 还返回其他诊断信息。
它看起来geoNear
提供了near
功能的超集。例如,near
似乎只返回最接近的 100 个文档,而geoNear
让您指定最大值。有理由使用near
而不是geoNear
吗?一个比另一个更有效吗?
看起来 mongodb 为地理空间查询提供了两个类似的功能 -$near
和$geoNear
. 根据 mongo 文档
geoNear 命令提供了 $near 运算符的替代方法。除了 $near 的功能之外,geoNear 还返回其他诊断信息。
它看起来geoNear
提供了near
功能的超集。例如,near
似乎只返回最接近的 100 个文档,而geoNear
让您指定最大值。有理由使用near
而不是geoNear
吗?一个比另一个更有效吗?
两者的效率应该相同。
geoNear
的主要限制是,作为命令,它可以返回设置为最大文档大小的结果,因为所有匹配的文档都在单个结果文档中返回。它还要求在每个结果文档中添加一个距离字段,这可能是也可能不是问题,具体取决于您的使用情况。
$near
是一个查询运算符,因此结果可以大于单个文档(它们仍然在单个响应中返回,但不是单个文档)。您还可以通过查询的 limit() 设置最大文档数。
我倾向于建议用户坚持使用,$near
除非他们需要命令中的diagnostics
(例如,距离或位置匹配)geonear
。
这些是主要区别:-
$geoNear 还可以为您提供与该点的距离,但 $near 命令没有。
$geoNear 命令要求集合最多只有一个 2d 索引和/或只有一个 2dsphere 索引,而像 $near 和 $geoWithin 这样的地理空间查询运算符允许集合具有多个地理空间索引。这是因为在 $geoNear 命令中没有指定要搜索的字段的选项,而在 $near 命令中您可以指定字段名称。
主要区别在于 $near 是一个查询运算符,但$geoNear
它是一个聚合阶段。两者都按离给定点最近到最远的顺序返回文档。
这意味着 $near 可以在 find() 查询或$match
聚合阶段使用,但$geoNear
不能。而是$geoNear
必须仅用作单独的聚合阶段。
每个功能提供的选项也不同。我邀请您查看相应文档部分中的详细信息:
GeoNear 的 100 个文档限制是默认行为,但您可以按照 mongodb 文档 ( http://docs.mongodb.org/manual/reference/command/geoNear/ )中的说明设置num字段
默认设置为 100,但您可以设置更多。不幸的是,目前缺少跳过参数(请参阅https://jira.mongodb.org/browse/SERVER-3925)