mongoDB 聚合管道中的 $addFields
$addFields in mongoDB aggregation pipeline
我正在使用聚合管道构建器的云mongoDB atlas 在线版本。
我的文档如下所示:
_id: 'a314314133351sd4d'
type: 'Test_993das'
我想要实现的是我得到一个名为 customField 的自定义字段,它计算所有具有类型为 Test 的子字符串的文档:
customField: 6
但是,当我使用阶段 $addFields 时,字符串无法正常工作。甚至来自文档的东西。
似乎在 addFields 阶段无法识别 $regexMatch,尽管文档表明这应该是可能的。
{ $addFields: { customField: { $regexMatch: { input: "$type", regex: "Test_*" } }
正如 tom slabbaert 所指出的,$regexMatch
仅在 MongoDB 4.2.x 上可用,此外,您的正则表达式无效(应该是 Test_
或Test_.*
).
但是,您使用的语法只会产生 customField: true
(或 false
),而不是计数。计数是聚合函数,因此需要对一组文档进行操作。除非您使用 $group
、$bucket
或 $count
.
之类的分组阶段,否则聚合管道会对每个文档进行操作
这意味着,在您的示例中,$addField
将评估正则表达式并在 each 文档中添加字段。所以你可能想要这样的东西:
[
{ $match: { 'type': { $regex: /Test_.*/ } } },
{ $count: 'customField' }
]
此外,如果您的正则表达式应该只匹配字符串的开头,那么如果您锚定正则表达式,您将获得更好的性能,如下所示:/^Test_.*/
{
$addFields: {
hasNewMessage: {
$cond: { if: {$gt: [{ $size: "$messages" }, 0]}, then: true, else: false}
}
}
}
我正在使用聚合管道构建器的云mongoDB atlas 在线版本。 我的文档如下所示:
_id: 'a314314133351sd4d'
type: 'Test_993das'
我想要实现的是我得到一个名为 customField 的自定义字段,它计算所有具有类型为 Test 的子字符串的文档:
customField: 6
但是,当我使用阶段 $addFields 时,字符串无法正常工作。甚至来自文档的东西。 似乎在 addFields 阶段无法识别 $regexMatch,尽管文档表明这应该是可能的。
{ $addFields: { customField: { $regexMatch: { input: "$type", regex: "Test_*" } }
正如 tom slabbaert 所指出的,$regexMatch
仅在 MongoDB 4.2.x 上可用,此外,您的正则表达式无效(应该是 Test_
或Test_.*
).
但是,您使用的语法只会产生 customField: true
(或 false
),而不是计数。计数是聚合函数,因此需要对一组文档进行操作。除非您使用 $group
、$bucket
或 $count
.
这意味着,在您的示例中,$addField
将评估正则表达式并在 each 文档中添加字段。所以你可能想要这样的东西:
[
{ $match: { 'type': { $regex: /Test_.*/ } } },
{ $count: 'customField' }
]
此外,如果您的正则表达式应该只匹配字符串的开头,那么如果您锚定正则表达式,您将获得更好的性能,如下所示:/^Test_.*/
{
$addFields: {
hasNewMessage: {
$cond: { if: {$gt: [{ $size: "$messages" }, 0]}, then: true, else: false}
}
}
}