Node.js 改变';更新地址';猫鼬中的字段名

Node.js 改变';更新地址';猫鼬中的字段名,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个mongoose模式,它具有以下时间戳属性: timestamps: { createdAt: 'created_at', updatedAt: 'updatedAt' } 这意味着集合中的文档具有“updated_at”和“created_at”字段。 如果我想在$rename操作中将这两个字段重命名回“createdAt”和“updatedAt”: $rename: { created_at: 'createdAt', updated_at: 'updatedAt'

我有一个mongoose模式,它具有以下时间戳属性:

timestamps: { createdAt: 'created_at', updatedAt: 'updatedAt' }
这意味着集合中的文档具有“updated_at”和“created_at”字段。 如果我想在$rename操作中将这两个字段重命名回“createdAt”和“updatedAt”:

$rename: {
    created_at: 'createdAt',
    updated_at: 'updatedAt'
 }
…仍然保留“updated_at”字段(显然,因为我没有更改模式中的时间戳行)。 但如果我已经将时间戳模式更改为行:

timestamps: true
谁应该将updated_at字段设置为updateeat,我得到一个“empty$rename object”错误,因为mongoose不再识别“updated_at”字段

那么,我如何才能成功完成此字段名转换


**额外问题:在包含大量文档的集合中,此操作需要数小时才能执行。是否有方法提高此操作的速度?

显示您试图发出的实际更新语句并启用
mongoose.set('debug',true)
。猜测一下,您可能必须在发布更新时设置
时间戳:false
,或者简单地执行
Model.collection.update()
,以便“绕过”mongoose试图添加的更新操作符。Schema.updateMany({},{$rename:{created_At:'createdAt',updated_:'updatedAt'}是的。我肯定会说doe
Schema.collection.updateMany({},{“$rename”:{created_at:'createdAt',updated_at:'updatedAt'}})
。坦白地说,如果你甚至需要在mongoose中运行它,因为你可以简单地使用类似shell的东西来发布它。不幸的是,
{“multi”:true}
选项(已由
updateMulti()
方法设置的)速度尽可能快。但简而言之,使用
.collection
访问器绕过“schema”直接转到驱动程序。这将阻止mongoose尝试“重写”update语句。感谢收集提示!但是操作仍然很慢…索引可能有用吗?有没有方法监视操作中更新的文档的进度?实际上是“删除”如果索引位于这些字段上,则会加快速度。否则不会。没有查询,因此没有索引选择。但是,如果该操作导致对这些字段上的索引进行额外写入,则删除它们,然后在操作完成后再次创建索引将更为有效。