猫鼬不是和 nosql 矛盾吗?

Kin*_*der 5 mongoose mongodb node.js

我看过很多关于 MongoDB 和 Mongoose 的视频和教程,虽然我认为 Mongoose 的工作做得很好,但它是否与 NoSql 数据存储提供的灵活性相矛盾?那是一个无模式的环境。

如果我想在我的文档中添加一个新属性或数组怎么办?我必须正确更新我的猫鼬模式吗?这对于灵活文档存储的全部意义来说似乎有悖常理。

如果我希望我的应用程序更加灵活,那么 Mongoose 不是我的应用程序的错误选择吗?

Adr*_*der 6

免责声明:我已经在一个非常大的企业应用程序中使用 Mongoose 大约 2 年,并且在那个 pre-mongoose 之上又使用了 mongo 一年。

文档提到

让我们面对现实吧,编写 MongoDB 验证、转换和业务逻辑样板是一种拖累。这就是我们编写 Mongoose 的原因。

除非您经历过痛苦,否则很难理解这种说法。

这就是梦想:您的应用程序是完美的,并且您可以将所需的内容准确地存储在一个集合中。您可以轻松地抛出或获取数据。它非常适合 linux 管道,而且大多数情况下都能正常工作!

我认为现实是,我们经常低估我们的数据至少具有轻微的相关性及其影响。大多数应用程序将 Mongo/NoSQL 视为非规范化数据存储:一个更快、更简单(使用)的数据库,您可以将完整的对象图放入其中并非常快速地读取它们。与 SQL + ORM 相比,这非常容易使用。我真的被吹走了一段时间。

但是,随着您的应用程序的开发,小事情开始变得更加复杂......

为了使其他集合中的嵌入数据保持同步,您需要在应用程序级别处理此问题。这意味着每当您保存 A 时,您可能需要在其他地方更新 B 和 C。示例:用户评论:您希望在每个评论中嵌入基本的用户对象。

随着时间的推移,事物 A、B 和 C 的定义会随着应用程序的增长而缓慢变化和演变。

将此与松散类型的语言相结合,很容易意外保存空字符串而不是 null,或 null 而不是 undefined。这是最好的情况。通常,您犯的这些小错误会被捕获并导致错误。现在它们将永远保存到您的数据库中,而您甚至不知道自己是否漏了。直到您的应用程序崩溃,因为您的数据是错误的。在你修复了其中的一些之后,你开始非常防御性地编程。小的改变现在很难,而且风险更高。

虽然您当然可以推出自己的(任何东西),但在您的应用程序代码和数据库之间添加一个小的安全网始终是一个好主意。很高兴知道 id 列总是意味着某件事。或者,当保存某些内容时,您可以保证检查 X、Y 和 Z。

或者,当您更改用户名时,它实际上会更新您的评论。

Mongoose 提供的验证、查询构建器、前/后保存挂钩、人口和其他好东西将为您省去很多痛苦。

归根结底,您需要在您想要投入的努力与您感到满意的正确性之间取得平衡。虽然我从简单的 mongo 访问中获得了很多价值,但拥有 mongoose 也是 Mongo 和成熟的 SQL/ORM 组合之间的一个很好的权宜之计。