Mongoose 默认值是不是适用于现有文档?

Posted

技术标签:

【中文标题】Mongoose 默认值是不是适用于现有文档?【英文标题】:Do Mongoose defaults get applied to existing documents?Mongoose 默认值是否适用于现有文档? 【发布时间】:2016-05-06 02:47:34 【问题描述】:

如果我将属性添加到 Mongoose 架构并为其指定默认值,现有文档在加载时会收到这些默认值吗?

【问题讨论】:

【参考方案1】:

您可以自定义default以忽略文档已经存在的情况。

除了default: Date.now,即使没有在数据库中设置,现有文档在获取时也会显示当前日期,您可以这样做:

default: function() 
  if (this.isNew) 
    return Date.now();
  
  return void 0;

现在,没有在数据库中设置字段的现有文档在获取时不会设置它。

【讨论】:

【参考方案2】:

是,但如果查询是lean,则不是。

对于返回完整 Mongoose 文档对象的查询 - Thing.find(...) - 无论何时更改架构,只要缺少该属性,就会返​​回默认值。如果随后保存该文档,则默认值将在数据库中实现。

如果查询是 leanThing.find(...).lean() – 查询只返回数据库中的内容,并且不包括任何新添加的默认值(除非文档已加载并保存,如上所述)。

【讨论】:

我们如何在现有文档上使用带有 mongo 默认值的精益?最终,我必须使用(和其他许多人一样).lean() Collection.aggregate() 也不使用默认参数。

以上是关于Mongoose 默认值是不是适用于现有文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值

Mongoose upsert 操作是不是更新/更新默认模式值?

Mongoose 将默认设置为空对象

Mongoose 将默认设置为空对象

为啥默认情况下不需要 mongoose 中的所有字段?

浏览器事件默认操作 - 是不是有规范?