我有一个mongodb集合,其中有许多对象,如下所示:
{
"_id" : "1234",
"type" : "automatic",
"subtypes" : [
{
"_id" : "dfgd",
"name" : "test subtype",
"subjetRequired" : true,
},
{
"_id" : "dfgd",
"name" : "test subtype2",
"subjetRequired" : false,
}
],
"anotherField" : "some value"
}如您所见,subtypes数组中的一个键拼写错误-- "subjetRequired“而不是"subjectRequired”。
我想更正那个密钥名。我怎么能这么做。
首先,我要说,我过去没有使用过很多mongodb。
经过大量的研究,我能想到的最好的方法是:(这不管用):
function remap(doc) {
subtypes = doc.subtypes;
var count = 0;
subtypes.forEach(function(subtype){
db.taskType.update({"_id": subtype._id}, {
$set: {"subtypes.subjectRequired" : subtype.subjetRequired},
$unset: {"subtypes.subjetRequired": 1}
});
}
)
}
db.taskType.find({"subtypes.subjetRequired":{$ne:null}}).forEach(remap);这不管用。
我知道循环是正确的,就好像我用print语句替换了其他逻辑一样,我可以访问和打印想要修改的字段。
我在这里做错什么了?
发布于 2022-08-24 12:43:21
您可以使用此更新并避免使用任何代码,它也是稳定的,因此您可以在不担心的情况下多次执行它。
db.collection.updateMany({
"subtypes.subjetRequired": {
$exists: true
}
},
[
{
$set: {
subtypes: {
$map: {
input: "$subtypes",
in: {
$mergeObjects: [
"$$this",
{
subjectRequired: "$$this.subjetRequired",
}
]
}
}
}
}
},
{
$unset: "subtypes.subjetRequired"
}
])发布于 2022-08-24 12:43:10
我可以修改您的循环以覆盖整个子类型数组:
function remap(doc) {
correctSubtypes = doc.subtypes.map(({ subjetRequired, ...rest }) => ({
...rest,
subjectRequired: subjetRequired,
}));
var count = 0;
db.taskType.findByIdAndUpdate(doc._id, {
$set: {
subtypes: correctSubtypes,
},
});
}https://stackoverflow.com/questions/73473302
复制相似问题