我正在编写一个Mongo查询构建器,我在文档中找到了两个语句:
(文本搜索)包含$ text的$ match阶段必须是管道中的第一个阶段。
(地理搜索)您只能将$ geoNear用作管道的第一个阶段。
这基本上意味着相同,所以...如何一起使用它们?
答案 0 :(得分:1)
我认为你不能。我过去做过的一件事就是执行两个查询并将结果合并到应用程序代码中。
答案 1 :(得分:0)
我知道这是一个古老的问题,但是最近我遇到了类似的问题,所以我认为应该发布解决方案。
就我而言,我想要:
我用如下代码块解决了它:
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作为过滤器传递给第二个。
这是我能找到的最高效的解决方案!