我正在编写一个Mongo查询构建器,并在文档中找到了两个语句:
这基本上意味着相同的事情,那么…如何同时使用它们?(文本搜索)包含$ text的$ match阶段必须是管道中的第一个阶段。
(地理搜索)您只能将$ geoNear用作管道的第一个阶段。
这基本上意味着相同的事情,那么…如何同时使用它们?(文本搜索)包含$ 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 作为筛选器传递给第二个查询。
这是我找到的最有效的解决方案!
我认为你做不到。过去,我做过的一件事是执行两个查询,并在应用程序代码中合并结果。
您可以创建一个匹配聚合阶段,并使用$geoWithin(或$geoIntersect)以及$text运算符。这似乎是最好的解决方案。
MongoDB Atlas Search还允许同时过滤全文和位置。