【发布时间】:2020-12-03 16:27:03
【问题描述】:
由于 Mongo 仅支持 一个 $text 字段每个聚合管道(在第一个 $match 阶段内),这意味着您不能执行逻辑 AND,因为您不能 @987654325 @多次$text搜索的结果。
// Fails due to "too many text expressions"
db.Employees.aggregate([
{$match: {$and: [
{$text: {$search: "senior"}},
{$text: {$search: "manager"}}
]}}
])
因此,我需要执行多个单独的$text 搜索,在我的 NodeJS 代码中组合结果,然后将该结果集传递回聚合管道以进行进一步处理(例如,$addFields、$match、$sort) .
有没有办法做类似的事情......
let results1 = db.Employees.find({"$text":{"$search":"senior"}}, {"score":{"$meta":"textScore"}})
let results2 = db.Employees.find({"$text":{"$search":"manager"}}, {"score":{"$meta":"textScore"}})
let combinedResults = _.intersectionWith(results1, results2, _.isEqual)
let finalResults = /* pass combinedResults into aggregation pipeline and execute it */
类似于$out operator 的反面,我在结果集中读取。
如果有帮助,我正在使用 NestJS 和 Mongoose。
【问题讨论】:
-
您是否正在寻找文档包含
Senior manager的短语类型的搜索? -
我已经查看了短语搜索 docs.mongodb.com/manual/reference/operator/query/text/#phrases 但我希望它匹配,即使这些术语彼此不相邻 - 所以文档应该在某些字段中包含
senior,和manager在某些领域。他们可以在同一个领域,但他们不必是。更好的例子可能是像“James AND manager”这样的搜索 -
有没有办法直接将预定义的文档数组输入聚合管道?
-
不幸的是,每个聚合只允许一个文本。你可以使用正则表达式吗?
-
我可能会因为一些正则表达式而失败 - 这会让我把所有东西都粘到一个聚合中吗?
标签: mongodb mongoose nestjs aggregation data-ingestion