【问题标题】:mongodb geoNear vs nearmongodb geoNear vs near
【发布时间】:2013-03-21 00:57:02
【问题描述】:

看起来 mongodb 为地理空间查询提供了两个类似的功能 - $near$geoNear。根据 mongo 文档

geoNear 命令提供了 $near 运算符的替代方法。在 除了 $near 的功能,geoNear 还返回额外的 诊断信息。

看起来geoNear 提供了near 功能的超集。例如,near 似乎只返回最接近的 100 个文档,而 geoNear 允许您指定最大值。是否有理由使用near 而不是geoNear?一个比另一个更有效吗?

【问题讨论】:

    标签: mongodb geospatial


    【解决方案1】:

    两者的效率应该相同。

    geoNear 的主要限制是,作为命令,它可以返回设置为最大文档大小的结果,因为所有匹配的文档都在单个结果文档中返回。它还要求在每个结果文档中添加一个距离字段,这可能是也可能不是问题,具体取决于您的使用情况。

    $near 是一个查询运算符,因此结果可以大于单个文档(它们仍然在单个响应中返回,但不是单个文档)。您还可以通过查询的 limit() 设置最大文档数。

    我倾向于建议用户坚持使用$near,除非他们需要来自geonear 命令的diagnostics(例如,距离或位置匹配)。

    【讨论】:

    • 感谢您的澄清。不清楚的一件事是,near 的文档说它返回 100 个文档,但是在我使用 mongo 2.4 进行的测试中,情况似乎并非如此。除非使用限制,否则似乎会返回所有文档。你知道应该是什么行为吗?
    • 简短回答:不,我不知道预期的 2.4 行为是什么。根据这张 Jira 票证 (jira.mongodb.org/browse/SERVER-5236),他们仍然没有修复 $near 查询的“渐进式”结果,因此它会在某个时候停止。您可能会看到查询只在第一批中返回尽可能多的结果,但最终该批的大小应该用尽。罗伯。
    • 至少它似乎不限于100,我认为是这样。感谢您的帮助。
    • 我认为自 2.6 以来大小限制不是问题,因为现在聚合命令可能返回光标,而不是文档(默认情况下)。
    • 2020 年更新:“您不能在 $match 查询中使用 $near 或 $nearSphere 作为聚合管道的一部分。”来源:docs.mongodb.com/manual/reference/operator/aggregation/match
    【解决方案2】:

    这些是主要区别:-

    1. $geoNear 还可以为您提供与该点的距离,但 $near 命令没有。

    2. $geoNear 命令要求集合最多只有一个 2d 索引和/或只有一个 2dsphere 索引,而像 $near 和 $geoWithin 这样的地理空间查询运算符允许集合有多个地理空间索引。 这是因为在 $geoNear 命令中没有指定要搜索的字段的选项,而在 $near 命令中您可以指定字段名称。

    【讨论】:

      【解决方案3】:

      主要区别在于$near是一个查询操作符,而$geoNear是一个聚合阶段。两者都按照离给定点最近到最远的顺序返回文档。

      这意味着 $near 可以用于 find() 查询或$match aggregation 阶段,但$geoNear 不能。相反,$geoNear 只能用作单独的聚合阶段。

      每个功能提供的选项也不同。我邀请您查看相应文档部分中的详细信息:

      $near documentation
      $geoNear documentation

      【讨论】:

        【解决方案4】:

        GeoNear 的 100 个文档限制是默认行为,但您可以按照 mongodb 文档 (http://docs.mongodb.org/manual/reference/command/geoNear/) 中的说明设置 num 字段

        默认设置为 100,但您可以设置更多。不幸的是,目前缺少 skip 参数 (见https://jira.mongodb.org/browse/SERVER-3925

        【讨论】:

        • 我认为 near 也默认为 100,但似乎并非如此
        • FWIW,这就是为什么对 100 个文档的限制存在一些混淆......曾经有一个限制。现在限制被删除:“从版本 4.2 开始,MongoDB 删除了 $geoNear 阶段的限制和数量选项以及 100 个文档的默认限制。”来自这里:docs.mongodb.com/manual/release-notes/4.2-compatibility/…
        猜你喜欢
        • 2012-11-29
        • 2013-10-20
        • 2015-04-23
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 2020-08-25
        • 2015-11-18
        • 1970-01-01
        相关资源
        最近更新 更多