【问题标题】:How does `mongoose` handle adding documents that have FIELDS that are __NOT__ part of the schema?`mongoose` 如何处理添加具有 __NOT__ 部分架构的字段的文档?
【发布时间】:2013-05-06 18:22:11
【问题描述】:

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

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

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

两个问题

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

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

谢谢。

【问题讨论】:

  • 我知道您的问题被标记为 Mongoose,但我发现真正有用且简约的一件事是 Guille 的 monk 包。我使用它包裹在 Kris Kowal 的 Q 中,创建了一个非常好的基于 promise 的方法来访问 MongoDB。
  • 嘿,我绝对喜欢建议。也很棒的建议。我只是看了一下这两个包,它们显然都值得一玩和了解。我花了相当多的时间确保猫鼬是一个很好的基础,然后得出结论,是的!真是太棒了。 Guille 是猫鼬和僧侣的作者之一。

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 超级。您完美地指出了解决方案。很容易迷失在文档中并错过一些东西。谢谢!现在,我要严格;你对未来情况的建议我可能不会,我很聪明。很好的答案。
  • 当我使用 entry.save({strict:'throw'}, function(err, entry, numAffected){ console.log(err); console.log('////// ///// 错误回调 //////////'); console.log(numAffected); });
【解决方案2】:

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

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

【讨论】:

  • 这也很有帮助,是一个潜在的解决方案。我接受了上述回复,因为它指出了确切的方法。否则,你是对的,中间件有很多巧妙地处理情况的可能性。我要和required一起玩到晚上。
  • @cathy.sasaki:np!最近,我发现 Angular、Monk 和 Q 的组合非常有用,可以提供我想要的 CRUD 和易于管理的 UI。
  • Neato!我刚刚通过谷歌查看了 Angular。我听到人们谈论它,但忙于节点/骨干网等等。是的,我需要把它放在我的学习计划中并使用它。感谢您提供指向此框架/模块的指针!
猜你喜欢
  • 2014-11-23
  • 2023-02-14
  • 2021-06-21
  • 2019-08-30
  • 2019-01-04
  • 2016-02-29
  • 2018-06-17
  • 2017-04-26
  • 2021-12-08
相关资源
最近更新 更多