【问题标题】:geoNear stage must be firstgeoNear 阶段必须是第一个
【发布时间】:2022-01-09 13:56:04
【问题描述】:

嘿,我一直在玩 mongodb geo api,它似乎非常有限,最值得注意的是不允许在它之前执行任何其他阶段的限制,我只遇到了可能的解决方案 $facet 但它限制了 @ 987654322@ 阶段也是如此,所以我没有选择,我需要在$geoNear 之前使用$match 阶段,我知道$geoNear 有它自己的查询,但geoNear 的coordinates 这是我当前的代码

  {
    $match: {/*query*/},
  },
  {
    $geoNear: {
      near: {
        type: 'Point',
        coordinates: '$geometry.coordinates' as unknown as [number, number],
      },
      distanceField: 'dist.calculated',
      maxDistance: 1000000,
      includeLocs: 'dist.location',
      spherical: true,
    },
  },

我知道这不是一个错误,而是 mongodb 贡献者所说的一个功能,但我真的需要以某种方式解决这个问题并首先执行匹配

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    $geoNear 聚合阶段专为过滤 文档而设计。它需要一个地理空间索引才能做到这一点。

    索引有助于在集合的数据文件中定位文档。聚合管道的第一阶段检索文档并将它们传递到管道中的第二阶段。

    这意味着第二个和后续阶段不能使用索引,因为索引将指示在原始集合中找到文档的位置,而不是在管道中。

    看来您已经制作了一个$geoNear 舞台,它将匹配地球上所有可能的点。

    假设这样做的目的是计算与参考点的距离,您可能会发现在客户端计算距离会更快。

    如果您需要管道中进一步阶段的距离,您可以使用 MongoDB 4.2 中添加的三角函数来实现 haversine 公式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多