我有一个非常异构的数据结构,里面有很多嵌套的数组和对象。像这样:
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"
而不单独为每个字段编写更新操作?
答案 0 :(得分:1)
在动态结构中没有直接的方法可以做到这一点,
从 MongoDB 4.4 开始,有一个自定义函数 $function 的选项,
<块引用>在 JavaScript 中定义自定义聚合函数或表达式。
您可以使用 $function
运算符定义自定义函数以实现 MongoDB 查询语言不支持的行为。另见$accumulator。
重要提示:
在聚合表达式中执行 JavaScript 可能会降低性能。仅当提供的管道运算符无法满足您的应用程序需求时才使用 $function
运算符。
/home/userA
并替换为 /home/userB
$mergeObject
将上面转换后的文档和 _id
合并,因为有时对象 id 会导致在 root 中替换的问题。$replaceRoot
将上述文档替换为 rootdb.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" }
]
}
}
}]
)