javascript - Node.js - 从域模型中抽象 Mongoose 模型

标签 javascript node.js mongodb mongoose domain-driven-design

我正在 node.js 中构建一个 rest API。我遵循通用的 DDD 架构,即存储库、域模型、实体、值对象等。 我选择 montodb 来满足我的持久性需求,并使用 mongoose 与 dB 引擎交互。

在 Mongoose 中,我们根据定义的模式创建模型。 我想弄清楚如何将我的领域模型与 Mongoose 模型分开。我想实现值对象,但我不知道如何使用 mongoose 模型来实现。

我找不到任何关于如何在任何地方执行此操作的信息。我想知道我是否会建议。我可以向 mongoose 模型添加方法,所以我猜它正在充当域模型。如果是这种情况,那么我该如何实现值对象?

最佳答案

Mongoose 模型不是纯粹的(它们依赖于基础设施和一些方法 - 例如 save - 有副作用)。我认为您无法使用此库获得 100% 纯 DDD 架构。

另一方面,使用纯 JavaScript 对象作为具有 MongoDB 持久性的模型(实体、聚合和值对象)非常有意义。它们之间有100%的阻抗匹配。

这是来自 MongoDB Javascript driver 的额外内容:

Mongo DB 数据类型

因此,在使用 Mongo DB 时要牢记一件重要的事情,那就是 Mongo DB 支持的类型与 native JavaScript 数据类型之间的轻微映射差异。让我们看看现成支持的类型,然后看一下驱动程序如何提升类型以使其尽可能接近原生 JavaScript 类型。

  • Float 是一个 8 字节,可直接转换为 Javascript 类型 Number

  • Double class 表示浮点值的特殊类,这在需要确保值始终为 float 的情况下使用上限集合时特别有用。

  • 整数有点棘手,因为 Javascript 将所有数字表示为 64 位 float ,这意味着最大整数值是 53 位。 Mongo 有两种整数类型,32 位和 64 位。如果可以,驱动程序将尝试将该值放入 32 位,并在必须时将其提升为 64 位。同样,如果可以的话,它将反序列化以尝试将其放入 53 位。如果不能,它将返回 Long 的实例以避免丢失精度。

  • Long 类是一个特殊的类,可以让您存储 64 位整数,还可以让您对 64 位整数进行操作。

  • 日期直接映射到 Javascript 日期

  • RegExp 直接映射到 Javascript RegExp

  • 字符串直接映射到 Javascript 字符串(以 utf8 编码)

  • Binary 类是一种特殊类,可让您将数据存储在 Mongo DB 中 代码类一个特殊的类,可以让你在 Mongo DB 中存储 javascript 函数,也可以提供一个范围来运行方法

  • ObjectID 类一个特殊的类,它包含一个 MongoDB 文档标识符(相当于一个主键)

  • DbRef 类一个特殊的类,允许您在文档中包含指向另一个对象的引用

  • Symbol 类是一个特殊的类,可让您指定一个符号,它与 JavaScript 无关,但与支持符号概念的语言相关。

关于javascript - Node.js - 从域模型中抽象 Mongoose 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47972033/

相关文章:

javascript - 在同一字符串中运行随机字符

javascript - 连接应用程序(node.js)对象不是函数

javascript - Mongoose 或 Query 不返回任何内容

javascript - 在窗口调整大小时更改 CSS 会破坏 CSS

javascript - 如何知道某个 JS 插件是否已加载?

javascript - jQuery post 使用express接收数据

javascript - 改变函数参数

node.js - 我不知道如何使用 nodejs native 驱动程序打印 mongodb 查询结果

mongodb加入 meteor

javascript - 修改firebase函数中的变量