24

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

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

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

两个问题

  1. 如何处理添加具有属于架构的mongoose字段的文档?似乎它只是忽略它们,如果没有字段映射,将创建一个仅带有 ObjectId 的空文档。
  2. mongoose即使文档已成功保存,如果尚未添加文档的特定字段,您如何警告您?

(问题是 - 我相信 - 足够简单,所以我没有添加代码,但如果有人要求,我肯定会添加。)

谢谢。

4

2 回答 2

27

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

strict 选项(默认启用)确保传递给模型构造函数但未在我们的模式中指定的值不会保存到数据库中。-猫鼬文档

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

strict 选项也可以设置为“throw”,这将导致产生错误而不是丢弃坏数据。-猫鼬文档

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

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

2.您可以查看混合模式类型是否可以满足您的需求,而不是禁用随附的验证strict。(向下滚动到该链接上的“使用说明”,因为“混合”文档的链接目前似乎已损坏。)

于 2013-05-13T00:14:17.043 回答
1

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

这个关于 stackoverflow 的问题/响应可以帮助确定对象是否具有属性。

于 2013-05-13T00:13:29.060 回答