如何解决MongoDB聚合-读取文档的操作员 汇总查询1:汇总查询2:
由于Mongo每个聚合管道(在第一个$text
阶段)仅支持一个 $match
字段,这意味着您无法执行逻辑AND,因为您可以't $and
是多次$text
搜索的结果。
// Fails due to "too many text expressions"
db.Employees.aggregate([
{$match: {$and: [
{$text: {$search: "senior"}},{$text: {$search: "manager"}}
]}}
])
因此,我需要执行多个单独的$text
搜索,将结果合并到我的NodeJS代码中,然后将该结果集传递回聚合管道以进行进一步处理(例如$addFields
,{{1} },$match
。
有没有办法做类似的事情...
$sort
类似$out operator的情况,我正在读取结果集。
如果有帮助,我正在使用NestJS和Mongoose。
解决方法
您已经知道$text
中有restrictions,
如果您有有限的字段,则可以使用$regexMatch,我不确定在多少个字段中具有文本索引,但是可以将匹配条件与$and
运算符结合使用多个字段,
示例数据:
[
{ _id: 1,f1: "senior",f2: "manager" },{ _id: 2,f1: "junior",{ _id: 3,f1: "fresher",f2: "developer" },{ _id: 4,f1: "manager",f2: "senior" }
]
汇总查询1:
-
$addFields
添加新字段matchResult
以匹配布尔值中的状态
db.collection.aggregate([
{
$addFields: {
matchResult: {
$and: [
- 如果
$or
或f1
字段匹配f2
,则第一个senior
条件匹配,然后返回true
,否则返回false
{
$or: [
{ $regexMatch: { input: "$f1",regex: "senior",options: "x" } },{ $regexMatch: { input: "$f2",options: "x" } }
]
},
-
如果
- 第二个
manager
条件匹配,然后返回true
,否则返回false
$or
或f1
字段匹配f2
,则 {
$or: [
{ $regexMatch: { input: "$f1",regex: "manager",options: "x" } }
]
}
]
}
}
},
-
$match
的条件返回结果为matchResult
等于true
{ $match: { matchResult: true } }
])
汇总查询2:
- 如果您不使用数组字段,那么这是一种排序方式,您可以直接在一个字段上合并所有字段,这里我将
f1
和f2
合并为allField
中的空格
db.collection.aggregate([
{
$addFields: {
allField: { $concat: ["$f1"," ","$f2"] }
}
},
- 如果两个单词都匹配,则这将匹配
$and
条件,如果两个都是true,则返回true,否则返回false
{
$addFields: {
matchResult: {
$and: [
{ $regexMatch: { input: "$allField",{ $regexMatch: { input: "$allField",options: "x" } }
]
}
}
},
-
$match
的条件返回结果为matchResult
等于true
{ $match: { matchResult: true } }
])
注意:这是有限字段的替代方法,但是如果成像超过5个字段,则会影响查询的速度和性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。