【问题标题】:Why does mongoose use schema when mongodb's benefit is supposed to be that it's schema-less?当 mongodb 的好处应该是无模式时,为什么 mongoose 使用模式?
【发布时间】:2012-10-17 23:04:45
【问题描述】:

我是 mongodb 的超级新手。我正在使用 mongoose 从 node.js 访问 mongodb,并且知道如何让事情正常工作,但我认为我不明白为什么它会以这种方式工作。

最重要的是,当 mongodb 的突出特点之一是它没有模式时,我不明白为什么 mongoose 有“模式”。有人可以启发我吗?谢谢。

【问题讨论】:

  • 我认为这是默认架构的情况,但是您可以在应用程序代码中动态添加字段,而无需更改整个表。一个例子是一个巨大的产品表,在 SQL 中添加一个字段既讨厌又慢,在 MongoDB 中只需将其添加到客户端模型中......
  • MongoDB 不是无模式的。它有灵活的架构 - 有很大的不同。
  • 这是一个口味问题,Mongoose 让您拥有一个带有验证的类型化模式,如果您使用驱动程序,您将无法获得它,并且必须自己滚动。另一方面,Mongoose 层会在一定程度上影响原始性能,因为它会进行一些内务处理,这会比原始驱动程序花费更多时间。
  • 我目前在 node/mongodb/mongoose 工作,但也深深扎根于 C#、LINQ 和 SQL Server。 Mongodb 确实有一个模式,但它的结构非常松散,因为它只是简单的对象、数组和 JavaScript 类型以及一些其他类型,如 ObjectId、Date 等。迫使您根据模式在代码中管理事物。 Mongoose 让您轻松定义数据结构,同时简化 mongodb 交互。我试过直接做 mongodb,而 mongoose 更方便,因为您不必发明自己的方式来强制执行您的架构。
  • 与原始驱动程序相比性能较弱是Mongoose唯一的负面影响吗?是否还有其他陷阱或哥特式,或者它是否值得在几乎所有用例中实施?

标签: node.js mongodb mongoose


【解决方案1】:

没有架构的数据是无用的。你从 MongoDB 得到一个文档,你用它做什么?阅读一些领域?您需要知道这些字段的名称、类型和含义。这是一个架构。

当人们说 MongoDB “没有模式”时,他们的真正意思是它不像 SQL 数据库那样强制执行模式。 MongoDB 将模式问题推到您的应用程序级别,您可以更灵活地处理它们。例如,为了向您的文档中添加一个新字段,您不需要对您的集合做一个全有或全无的ALTER — 可能有数百万个条目。您只需将该字段添加到您的 ODM (Mongoose) 架构中即可。

【讨论】:

  • 不完全正确。有些实时应用程序可以依赖动态创建的字段。向 Mongoose 模型添加一个字段意味着一个新的部署过程。有些 ODM 不需要固定的架构定义,例如 Mongorito。
  • 听说过自定义字段吗?假设您希望您的客户能够定义自己的模式,您希望将其存储在自己的集合中,而不必让开发人员为每个客户更改代码。这是无模式设计的完美用例。
  • @TimHardy 你说“定义他们自己的模式”,然后称其为“无模式”——看到矛盾了吗?我没有说“没有静态模式的数据是无用的”。
  • @TimHardy 读取数据会不会很麻烦?也许它需要读取条件代码来了解特定文档中是否存在特定字段。
  • 是的,我将无静态模式称为“无模式”。在我的场景中,模式存储在 MongoDb 中 - 也许最好将其称为动态模式。
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2012-03-15
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多