【问题标题】:Cannot use aggregation operations in $set inside updateMany不能在 updateMany 中的 $set 中使用聚合操作
【发布时间】:2021-09-21 19:08:10
【问题描述】:

我有一个 mongoDB (4.4.8) 集合,我想根据之前的值更改某个字段的值。比如我想把所有的字符串都转成大写。

为此,我使用以下查询:

db.collection.updateMany(
    { field: { $regex: "[a-z]+"}},
    { $set: { field: { $toUpper: "$field" } } }
)

执行查询时,出现以下错误:

MongoError: 'field.$toUpper' 中的美元 ($) 前缀字段 '$toUpper' 对存储无效

如果我使用类似的操作,例如 $concat(带有数组参数)将某些内容附加到字段,也会发生同样的情况。

当我查找类似的问题时,它都使用update 并告诉我改用updateMany,或者它说它只适用于 mongoDB >= 4.2。不过,这两样东西我都有。

如果我是正确的,您可以将聚合语法(其中$toUpper)与 $set 结合使用 updateMany 查询这些较新版本的 mongoDB。

有谁知道我在这里做错了什么?

【问题讨论】:

  • 如果我没记错的话,聚合阶段到update 一个是使用[ ],比如this example
  • $toUpper 运算符是一个聚合运算符,您在常规更新查询中使用过,您尝试使用聚合管道进行更新,只需将更新部分包装在数组括号 [] 中。

标签: mongodb


【解决方案1】:

就像在 J.F. 和 turivishal 的 cmets 中一样,我设法通过将其更改为以下内容来解决这个问题:

db.collection.updateMany(
    { field: { $regex: "[a-z]+"}},
    [ { $set: { field: { $toUpper: "$field" } } } ]
)

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2021-12-06
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多