【问题标题】:How to add an attribute to an existing document with Mongoose?如何使用 Mongoose 向现有文档添加属性?
【发布时间】:2013-01-15 04:49:12
【问题描述】:

我在数据库中有一个现有的用户对象。

我已经修改了我的模型/user.js 以将属性“isAdmin”添加到用户架构中。

  , isAdmin     : { type: Boolean, default: false }

但是现在当我保存文档时(即:我更新了我的个人资料)。当我在我的应用程序中使用 console.log(user) 时,isAdmin 属性会出现......(它是预期的错误)......但是当我直接转到 mongo db 控制台时,它不存在于现有文档中。

如果我创建一个新的用户对象,isAdmin 属性会出现在新文档中。如何将此属性添加到现有文档中,以便它直接显示在数据库中?

编辑:我决定添加一个role 属性,只需在robomongo 中修改特定用户,将其角色设置为admin,而不是使用猫鼬来完成。

【问题讨论】:

  • 只是出于好奇,您为什么希望所有文档都具有新属性?像 MongoDB 这样的文档数据库的部分吸引力在于,并非所有文档都需要具有相同的结构。我宁愿利用这一点,也不愿与它“战斗”。
  • 我定义了模式并保存了用户对象,希望能够手动进入数据库并将我的帐户的 isAdmin 标志设置为 true。但是那个属性没​​有出现。即使当我使用猫鼬转储对象时,它也设置为 false。这让我很困惑。
  • 嘿@chovy 我有同样的问题,事实上我也在尝试为定义的猫鼬模型添加一个新属性,例如,因为你已经向模型添加了一个新的属性 isAdmin,然后只有新用户才能在集合中拥有 isAdmin 属性吗?在处理请求时,我们缺少旧用户的 isAdmin 属性..,您将如何处理这个问题?您可能会争辩说,旧用户会是得到一个 false 的属性,但我不这么认为,我必须尝试一下..,有人尝试过吗?

标签: node.js mongodb mongoose


【解决方案1】:

我同意 Hector 关于编写代码以将缺少的 isAdmin 字段与将其设置为 false 相同,而不是为此烦恼。

但如果您希望这样做,一种方法是显式将isAdmin 标记为已修改,以便随后对save 的调用将写出默认值:

doc.markModified('isAdmin');
doc.save();

【讨论】:

  • 它将如何工作,这里的文档是什么?,实际上他正在尝试为定义的猫鼬模型添加一个新属性,例如,他已经为模型添加了一个新属性 isAdmin,然后只有新用户才能在集合中拥有 isAdmin 属性吗?在处理请求时,我们缺少旧用户的 isAdmin 属性..,您将如何处理这个问题?您可能会争辩说,旧用户会是得到一个 false 的属性,但我不这么认为,我必须尝试一下..,有人尝试过吗?
【解决方案2】:

只需更新 mongo shell 中的现有文档以添加新属性。

【讨论】:

  • 其实我有点担心不使用Mongoose手动添加属性会导致一些冲突。
  • 哦,我明白了。但除非这个持久化框架有一些像ifNull:false 这样的架构选项,否则我认为它不会为您的文档添加缺失的属性。
  • 我最终添加了一个 user.role 属性,并为使用 RoboMongo 的管理员用户手动更新为等于 user.role = 'admin'
  • 这对于生产应用程序来说是不合理的,尤其是那些有大量记录的应用程序,运行这种类型的查询会花费大量时间
  • @Hypermattt 也许散列索引会有所帮助,如果情况是 find({ isAdmin: true })
猜你喜欢
  • 1970-01-01
  • 2023-02-14
  • 2017-07-24
  • 2013-08-30
  • 1970-01-01
  • 2014-07-20
  • 2012-01-27
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多