如何与 geoNear 一起执行文本搜索?

6
我正在编写一个Mongo查询构建器,并在文档中找到了两个语句:

(文本搜索)包含$ text的$ match阶段必须是管道中的第一个阶段。

(地理搜索)您只能将$ geoNear用作管道的第一个阶段。

这基本上意味着相同的事情,那么…如何同时使用它们?
3个回答

3

我知道这是一个老问题,但是我最近遇到了类似的问题,所以我想发布我的解决方案。

在我的情况下,我想要:

  • 首先使用用户提供的关键字作为筛选器进行全文搜索
  • 然后,按照距离用户提供的坐标的距离对结果进行排序
  • 用户可以选择提供关键字、位置或两者(比较困难的情况)

我用这样一段代码来解决它:


let query = {}

if(req.query.keywords){
  if(req.query.lng || req.query.lat){
    db.collection("service")
      .find({ $text: { $search: req.query.keywords }})
      .toArray()
      .then(docs => query._id = { $in: docs.map(doc => doc._id) })
  } else {
    query.$text = { $search: req.query.keywords }
  }
}

if(req.query.lat && req.query.lng){
  query.location = {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [req.query.lng, req.query.lat]
      }
    }
  }
}

db.collection("service").find(query)

如果只需要文本搜索或地理位置搜索,那么可以轻松地构建相应的查询。如果两者都需要,首先进行文本查询,然后将返回的文档 ID 作为筛选器传递给第二个查询。

这是我找到的最有效的解决方案!


1

我认为你做不到。过去,我做过的一件事是执行两个查询,并在应用程序代码中合并结果。


MongoDB永远卡在Ls。 - r3wt

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接