【问题标题】:Update fields in previously saved documents using mongoose使用 mongoose 更新以前保存的文档中的字段
【发布时间】:2020-04-02 08:33:28
【问题描述】:

我有一个想要更新的旧架构。更新架构后,在新架构之前保存的先前记录不会反映我在新架构上指定的新字段。如何使它们反映新架构上的所有字段。 我尝试使用mongoose defaults,但没有成功。 这是我的代码

const user = mongoose.Schema({
  _id : mongoose.Schema.Types.ObjectId,
  email : String,
  firstname : String,
  lastname : String
})

module.exports = mongoose.model('User', user)

我想添加age 字段(它应该出现在所有以前的文档中)。目前,只有新文档反映了age 字段。我怎么做?谢谢!

【问题讨论】:

  • 据我所知,猫鼬模式正在写入,所以default 帮助您写入,如果在新的插入文档中,如果您没有发送age 字段,那么猫鼬会写入doc 到 DB,包括 age 字段,架构中有默认值。但是,如果您想拥有该年龄字段,您必须使用默认值更新所有旧文档,或者您可以编写查询来执行此操作,您如何查询,您能给我们您的查询代码吗?

标签: node.js mongodb mongoose


【解决方案1】:

您可以只运行updateMany 命令并过滤掉所有没有age 字段的User's,然后添加值为undefinedage 字段:

User.updateMany({ age: { $exists: false} }, { $set: { age: undefined } });

除了通过mongoose 执行此操作外,您还可以直接进入数据库并通过mongo shell 执行此操作,如下所示:

db.users.updateMany({ age: { $exists: false} }, { $set: { age: undefined } });

这是一个 gif 图像:

【讨论】:

  • 如果用户更新他/她的信息,是否会将值设置为 undefined 更改为应有的值?例如,我添加了一个 avatar 字段,它是一个字符串,用于获取注册时使用的电子邮件的 gravatar 图像,如果我按照您指定的操作进行更新
  • @saas_joel 我不确定我是否理解您的问题。在此示例中,我只是向所有没有该字段的users 添加一个字段,然后将该字段设置为undefined。此示例不是用于更新单个用户,而是用于更新所有用户并向他们添加一个新字段(如果它不存在)。那是你的用例吗?
  • 是的,我现在明白了。我的用例是 Gravatar 特定的,尽管您上面指定的内容确实派上了用场。谢谢
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2020-11-19
  • 2019-12-12
  • 2019-02-26
  • 2015-02-09
  • 2016-02-15
相关资源
最近更新 更多