Node.js “mongoose”如何处理添加字段不是架构一部分的文档?

Node.js “mongoose”如何处理添加字段不是架构一部分的文档?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我在玩猫鼬的快速入门指南 我假设,当我保存一个带有未在模式中定义的字段的文档时,它会抛出一个错误。相反,它在集合中创建了一个新文档,但没有字段。(注意:我意识到mongodb本身是“无模式”的,所以集合中的每个文档可以完全不同。) 两个问题 mongoose如何处理添加字段不属于架构一部分的文档?它似乎只是忽略了它们,如果没有任何字段映射,就会创建一个只有ObjectId的空文档 如果文档的某个特定字段未被添加,即使文档已成功保存,您如何让mongoose发出警告 (问题是——我相信——足够简

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

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

两个问题

  • mongoose
    如何处理添加字段不属于架构一部分的文档?它似乎只是忽略了它们,如果没有任何字段映射,就会创建一个只有ObjectId的空文档
  • 如果文档的某个特定字段未被添加,即使文档已成功保存,您如何让
    mongoose
    发出警告
  • (问题是——我相信——足够简单,所以我没有添加代码,但如果有人请求,我肯定会添加。)

    谢谢。

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


    stackoverflow上的此选项有助于确定对象是否具有属性。

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

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

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

    strict选项也可以设置为“throw”,这将导致错误 而不是删除坏数据。-

    …但是如果您确实需要保存架构中没有的键,那么您必须自己处理。我能想到的两种方法是:

    1。要保存不在架构中的键,可以在或上将
    strict
    设置为false。然后,您需要编写一些验证(a)文档中的值符合您的标准,以及(b)保存在数据库中的文档与您发送的文档匹配


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

    我意识到您的问题被标记为Mongoose,但我发现一件非常有用且极简的东西是Guille的软件包。我用Kris Kowal的包做了一个非常好的基于承诺的方法来访问MongoDB。建议也很好。我只是看了一下这两个软件包,它们显然都值得玩玩和了解。我花了相当多的时间来确定猫鼬是一个好地方,然后得出结论,是的!真是太棒了。Guille是mongoose和monk.Super的作者之一。你精确地找到了解决办法。很容易在文档中迷失方向,错过一些东西。谢谢现在,我要严格;你对未来情况的建议我可能不会,我很聪明。回答得很好。当我使用entry.save({strict:'throw')、函数(err,entry,numAffected){console.log(err);console.log('/////////////////err callback////console.log(numAffected);});这也很有帮助,是一个潜在的解决方案。我接受了上述回答,因为它指出了确切的方法。否则,您是对的,中间件在灵活处理情况方面有很多可能性。今晚我要玩
    required
    。@cathy.sasaki:np!最近,我发现Angular、Monk和Q的组合非常有用,给了我想要的简陋且易于管理的UI。Neato!我只是通过谷歌浏览了一下。我听过人们谈论它,但忙于节点/主干等。是的,我需要把它放在我的学习日程上并使用它。感谢您为本框架/模块提供的指导!