“mongoose”如何处理添加具有__NOT__模式部分的FIELDS的文档?

我正在玩mongoose快速入门指南。

http://mongoosejs.com/docs/index.html

我认为当我保存了一个文档中没有在模式中定义的字段时会引发错误。 相反,它在集合中创build了一个新的文档,但没有这个字段。 (注:我意识到mongodb本身是“无模式”的,因此集合中的每个文档都可以完全不同)。

两个问题

  1. mongoose如何处理添加属于模式一部分的字段的文档? 它似乎只是忽略它们,如果没有任何字段映射,只会用ObjectId创build一个空文档。
  2. 如果即使文档成功保存,文档的特定字段还没有被添加,您如何获得mongoose来警告您?

(问题是 – 我相信 – 很简单,所以我没有添加代码,但如果有人请求,我肯定会。

谢谢。

问:mongoose如何处理添加不属于模式一部分的字段的文档?

strict选项(默认启用)确保传递给我们的模型构造函数的值在我们的模式中没有被指定,不会被保存到数据库中。 – mongoose文档

问:如果即使文档成功保存,文档的特定字段尚未添加,您如何获得mongoose来警告您?

严格的选项也可能被设置为“扔”,这将导致错误产生,而不是丢弃不良的数据。 – mongoose文档

…但是如果你绝对需要保存不在模式中的密钥,那么你必须自己处理。 我能想到的两种方法是:

1.要保存不在模式中的键,可以在特定模型实例或特定更新上将strict设置为false。 然后,您需要写一些validation(a)文档中的值符合您的标准;(b)保存在数据库中的文档与您发送的文档相匹配。

2.您可以看到混合模式types是否可以满足您的需求,而不是禁用strictvalidation。 (在该链接上向下滚动到“使用说明”,因为目前“混合”文档的链接似乎已经中断。)

Mongoose允许您添加执行有用function的“validation器”和“预”中间件。 例如,您可以在模式中指定required属性,以指示必须设置特定的属性。 如果关联的属性不符合您的规范,您也可以指定一个validator ,以便发出错误。 您也可以设置一个Mongoose "pre" validator来检查文档,如果发现字段超出了您的模式,则会抛出一个错误。 通过让您的中间件调用next() (或不),您可以控制是否继续文档保存(或不)。

这个问题/ stackoverflow上的响应可以帮助搞清楚对象是否有一个属性。