首页 > 解决方案 > 如何根据取决于输入的算术表达式过滤 mongodb 中的结果?

问题描述

假设我有一个包含这样条目的集合:

{_id: "foo" lng: -98.21 lat: 77.131 }
{_id: "foo" lng: -100.12 lat: 770.313 }
{_id: "foo" lng: -98.32 lat: 772.123 }

其中 lng 和 lat 对应经度和纬度。

我只想返回输入经度和纬度一定半径内的条目。因此,这意味着对于半径 R,sqrt((inputLatiude - docLatitude)^2 + (inputLongitude - docLonguitude)^2) < R。我不想返回所有文档并添加一个告诉我它是否在R与否。我只想返回符合条件的字段。我如何查询这个?

标签: mongodb

解决方案


您需要在此处使用$near来执行此操作。但是$near需要构建一个2dsphere索引,由于文档结构与所需结构不匹配,目前您似乎没有该索引。

那么你必须做什么?

  1. 重组您的文档,以便lnglat字段可以被 2dsphere 索引:
{
   _id: "foo",
   loc : { type: "Point", coordinates: [ -98.21, 77.131 ] },
}
  1. 在字段上建立这样的索引loc

  2. 用于$near查询:

db.collection.find(
   {
     loc:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ inputLng, inputLat ] },
            $maxDistance: R
          }
       }
   }
)


推荐阅读