【问题标题】:Mongodb - update replacing a pattern of an array elementMongodb - 更新替换数组元素的模式
【发布时间】:2021-11-16 07:20:38
【问题描述】:

给定:如下文档

{
    _id: ObjectId("5eb...."),
    jobId: '40297467',
    aliases: [aX1, bX2_0, cX1X9_0]
}

何时: X1...X9 组合在任何别名中都不受欢迎

那么:我想要一个 mongo 原生优雅的方式用空字符串替换适当的正则表达式模式,因此,我的文档为下面:

{
    _id: ObjectId("5eb...."),
    jobId: '40297467',
    aliases: [a, b_0, c_0]
}

作业完成:

这里MONGO mongodb script to replace a substring from a array element 有一个解决方案,用于不需要模式并且有一个简单的字符串要替换的情况,但是,它没有多大用处 - 因为聚合 replaceAll 找到参数 “任何解析为字符串或空值的有效表达式” (https://docs.mongodb.com/manual/reference/operator/aggregation/replaceAll/) 所以,如果我使用模式,它就不起作用。

mongo forEach 循环完成了这项工作,但对我来说它看起来有点难看......此外,我不确定这种循环的价格是多少。

db.col.find({ jobId: "40297467" }).forEach(function (x) {
  const regex = /*pattern*/gi;
  array = []
  for (let alias of x.aliases) {
    array.push(alias.replace(regex, ""));
  }
  db.col.update({ _id: x._id }, { $set: { aliases: array} });
});

任何帮助将不胜感激:)

【问题讨论】:

    标签: javascript arrays regex mongodb


    【解决方案1】:

    此聚合管道更新适用于 MongoDB v4.4(使用 $function 聚合运算符):

    db.collection.updateMany(
    { },
    [
      { 
          $set: { 
              aliases: {
                  $function: {
                      body: function(arr) {
                                   arr = arr.map(e => e.replace(/x\d/gi, ""));
                                   return arr;
                      },
                      args: [ "$aliases" ],
                      lang: "js"
                  }
              }
          }
      }
    ])
    

    【讨论】:

    • 只是为了澄清-与问题中的 find().forEach() 相比,您的此解决方案是否具有任何性能优势?当然除了重构,因为我认为 arr = arr.map(e => e.replace(/x\d/gi, "")); 行也可以在我的解决方案中使用。跨度>
    • 声明arr = arr.map(e => e.replace(/x\d/gi, ""));是纯JavaScript;所以你也可以在你的代码中使用它。将更新与聚合管道(解决方案)一起使用的好处是整个代码(包括 JS 函数)在 MongoDB 数据库服务器上运行。您提交更新,更新发生在服务器上,您会收到更新确认。您的代码处理读取(find 调用数据库)、客户端程序上的处理以及服务器上的更新。
    • 好的,很酷,谢谢你的解释和你的时间
    猜你喜欢
    • 2013-09-07
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多