gpt4 book ai didi

node.js - Mongo 的 updateMany 重命名不会更新某些字段

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:32 25 4
gpt4 key购买 nike

描述

MongoDB 的 updateMany$rename 一起使用时,方法不会更新任何文档在某些领域。

示例

我尝试重命名字段blog.blog_ttileblog.blog_cotnet 。我检查了拼写错误,没有。

Example model:

User: {
name,
email,
blog: {
blog_ttile,
blog_cotnet
}
}

代码:

const mongoose = require('mongoose');

const User = mongoose.model('User');

const nameChanges = {
"blog.blog_ttile": 'blog.title',
'blog.blog_cotnet': 'blog.content',
};

async function performNameChanges() {
try {
const updatedDocuments = await User.updateMany({}, { $rename: nameChanges });

console.log({ updatedDocuments });
} catch(err) {
console.error(err);
}
}

返回:

{ updatedDocuments: { ok: 0, n: 0, nModified: 0 } }

其他详细信息

某些字段已被正确识别。比方说email在上面的例子中。但是,当我尝试更新更新后的名称时,它不再起作用。有趣的是,它仍然检测到原始名称。

示例:

重命名 emailpersonal_email作品。重命名personal_emailemail之后不会并返回 { ok: 0, n: 0, nModified: 0 } 。在 email 上调用重命名第二次返回{ n: <total_records>, nModified: 0, ok: 1 }虽然没有文件有email不再了`。

这可能是什么原因造成的?

注意:这个问题适用于没有 Mongoose 的 MongoDB db.getCollection("User").updateMany而不是User.updateMany

最佳答案

我尝试在 MongoDB 中做同样的事情。它按预期工作。在你的例子中,我怀疑 Mongoose 模式是造成这种奇怪行为的原因。 Mongoose Schema 必须具有您要重命名的字段。如果该字段不存在,则返回 nModified 0。架构需要同时具有旧名称和新名称。旧的允许迁移,新的允许代码中的新逻辑。

您的返回结果是:

{ updatedDocuments: { ok: 0, n: 0, nModified: 0 } }

这怎么可能? n=0?对于查询 {}。仅当您的集合中没有元素时才有可能。 n 表示匹配计数,它必须等于您集合中的记录总数。

Renaming email to personal_email works

在第一次更新之前,您的架构很好。但是重命名(第一次更新)后,您应该将架构更新为:

User: {
name,
personal_email,
blog: {
blog_tile,
blog_contnet
}
}

在运行第二次更新之前(重命名回电子邮件)。

关于node.js - Mongo 的 updateMany 重命名不会更新某些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com