替换所有文档中的所有字符串字段

时间:2021-05-25 16:32:12

标签: mongodb

我有一个非常异构的数据结构,里面有很多嵌套的数组和对象。像这样:

    from spacy.lammatizer import Lemmatizer
    from spacy.lang.en import LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES
    lemmatizer = Lemmatizer(LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES)
    lemmatizer('chuckles','NOUN')

是否有可能更新所有文档的所有字符串字段并将 { ..., "centralPath": "/home/userA/path/to/central", "pathObjs": [{ "differentPath": "/home/userA/path/to/1" }, { "differentPath": "/home/userA/path/to/2" }], ... } 替换为 "/home/userA" 而不单独为每个字段编写更新操作?

1 个答案:

答案 0 :(得分:1)

在动态结构中没有直接的方法可以做到这一点,

从 MongoDB 4.4 开始,有一个自定义函数 $function 的选项,

<块引用>

在 JavaScript 中定义自定义聚合函数或表达式。

您可以使用 $function 运算符定义自定义函数以实现 MongoDB 查询语言不支持的行为。另见$accumulator

重要提示:

在聚合表达式中执行 JavaScript 可能会降低性能。仅当提供的管道运算符无法满足您的应用程序需求时才使用 $function 运算符。

  • js 函数将根文档转换为 stringify 格式
  • 将在上面的字符串中搜索 /home/userA 并替换为 /home/userB
  • 将字符串解析为 JSON 字符串并返回
  • $mergeObject 将上面转换后的文档和 _id 合并,因为有时对象 id 会导致在 root 中替换的问题。
  • $replaceRoot 将上述文档替换为 root
db.collection.updateMany({},
  [{
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            $function: {
              body: function(root) {
                var str = JSON.stringify(root);
                str = str.replace(new RegExp("/home/userA", 'g'), "/home/userB");
                return JSON.parse(str);
              },
              args: ["$$ROOT"],
              lang: "js"
            }
          },
          { _id: "$_id" }
        ]
      }
    }
  }]
)

Playground