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}
    }
  }
}