`mongoose`如何处理添加具有__NOT__作为模式的一部分的FIELDS的文档?

时间:2013-05-12 16:55:05

标签: node.js mongodb mongoose

我正在玩猫鼬的快速入门指南。

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

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

两个问题

  1. mongoose如何处理添加具有 NOT 字段的字段的文档?它似乎只是忽略它们,如果没有任何字段映射,只会使用ObjectId创建一个空文档。
  2. 即使文档成功保存,如果未添加文档的特定字段,您如何得到mongoose警告您?
  3. (问题是 - 我相信 - 很简单,所以我没有添加代码,但如果有人请求,我肯定会。)

    感谢。

2 个答案:

答案 0 :(得分:25)

问:mongoose如何处理添加包含不属于架构的字段的文档?

  

strict选项(默认情况下启用)确保传递给我们的模型构造函数的未在我们的模式中指定的值不会保存到db。    - mongoose docs

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

  

strict选项也可能设置为“throw”,这会导致错误   生产而不是丢弃坏数据。 - mongoose docs

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

1。要保存模式中没有的密钥,您可以在specific model instancespecific update上将strict设置为false。然后,您需要编写一些验证:(a)文档中的值符合您的标准;(b)保存在数据库中的文档与您发送的文档相匹配。

2。您可以看到Mixed schema type是否可以满足您的需求,而不是禁用strict附带的验证。 (向下滚动到该链接上的“使用说明”,因为目前“混合”文档的链接似乎已被破坏。)

答案 1 :(得分:1)

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

stackoverflow上的question/response可以帮助确定对象是否具有属性。