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

Mongodb 如何与geoNear一起执行文本搜索?,mongodb,full-text-search,Mongodb,Full Text Search,我正在编写Mongo查询生成器,在文档中发现了两条语句: (文本搜索)包含$Text的$match阶段必须是管道中的第一个阶段 (地理搜索)只能将$geoNear用作管道的第一阶段 基本上意思是一样的,所以。。。如何将它们结合使用?我想你不能。我过去做过的一件事是执行两个查询,并将结果合并到应用程序代码中 我知道这是一个老问题,但我最近遇到了一个类似的问题,所以我想我应该发布我的解决方案 就我而言,我想要: 首先对用户提供的关键字使用全文搜索作为过滤器 然后,根据距离用户提供的坐标对结果进行排

我正在编写Mongo查询生成器,在文档中发现了两条语句:

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

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


基本上意思是一样的,所以。。。如何将它们结合使用?

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

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

就我而言,我想要:

  • 首先对用户提供的关键字使用全文搜索作为过滤器
  • 然后,根据距离用户提供的坐标对结果进行排序
  • 用户可以选择提供关键字、位置或两者(较难的情况)
我用如下代码块解决了这个问题:


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作为筛选器传递给第二个


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

mongodb永远持有Ls。