猫鼬批量更新和代码优化



我需要帮助更新我的旧记录。我所做的是将旧记录更改为新的DB结构。旧的element。name是字符串,现在我把它改成object。我还从对象中删除了一些不必要的键。一切正常,但我有大量的数据。我想以一种有效的方式更新记录。有办法一次更新或者分段更新吗?由于

async function convertOldToNew() {
const progresses = await this.progressModel
.find({})
.select({ habitos: 1, answers: 1 });
progresses.forEach(async (progress) => {
if (progress.answers) {
progress.answers.forEach((element) => {
element.name = { es: element.name };
});
}
if (progress.habitos) {
if (progress.habitos.residuos && progress.habitos.residuos.length > 0) {
progress.habitos.residuos = progress.habitos.residuos.map((element) => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
});
}
if (progress.habitos.consumo && progress.habitos.consumo.length > 0) {
progress.habitos.consumo = progress.habitos.consumo.map((element) => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
});
}
if (
progress.habitos.transporte &&
progress.habitos.transporte.length > 0
) {
progress.habitos.transporte = progress.habitos.transporte.map(
(element) => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
}
);
}
}
await progress.save();
});
}

这是我想到的逻辑。

async convertOldToNew() {
const totalProgress = await this.progressModel
.find({
$or: [
{ answers: { $exists: true, $ne: [] } },
{ 'habitos.consumo': { $exists: true, $ne: [] } },
{ 'habitos.residuos': { $exists: true, $ne: [] } },
{ 'habitos.transporte': { $exists: true, $ne: [] } },
],
})
.count();
for (let i = 0; i < totalProgress; i++) {
let limitCounter = 1000;
let skipCounter = 0;
const progresses = await this.progressModel
.find({
$or: [
{ answers: { $exists: true, $ne: [] } },
{ 'habitos.consumo': { $exists: true, $ne: [] } },
{ 'habitos.residuos': { $exists: true, $ne: [] } },
{ 'habitos.transporte': { $exists: true, $ne: [] } },
],
})
.select({ habitos: 1, answers: 1 })
.limit(i == 0 ? limitCounter : limitCounter + 1000)
.skip(i == 0 ? skipCounter : skipCounter + 1000);
if (progresses.length > 0) {
progresses.forEach(async progress => {
if (progress.answers) {
progress.answers.forEach(element => {
element.name = { es: element.name };
});
}
if (progress.habitos) {
if (progress.habitos.residuos && progress.habitos.residuos.length > 0) {
progress.habitos.residuos = progress.habitos.residuos.map(element => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
});
}
if (progress.habitos.consumo && progress.habitos.consumo.length > 0) {
progress.habitos.consumo = progress.habitos.consumo.map(element => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
});
}
if (progress.habitos.transporte && progress.habitos.transporte.length > 0) {
progress.habitos.transporte = progress.habitos.transporte.map(element => {
element = JSON.parse(JSON.stringify(element));
delete element['name'];
delete element['how'];
delete element['why'];
return element;
});
}
}
await progress.save();
});
}
break;
}
}

最新更新