Node.js - 从域模型中提取猫鼬模型

时间:2017-12-25 21:05:32

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

我正在节点中构建一个rest API。我遵循一般的ddd架构,即存储库,域模型,实体,值对象等。 我选择montodb来满足我的持久性需求,并使用mongoose与dB引擎接口。

在mongoose中,我们从定义的模式中创建模型。 我试图找出如何将我的域模型与猫鼬模型分开。我想实现价值对象,我不知道如何用猫鼬模型做到这一点。

我无法找到有关如何在任何地方执行此操作的任何信息。我想知道是不是我可能会建议。我可以为猫鼬模型添加方法,所以我猜它是一个域模型。如果是这种情况,那么我该如何实现值对象呢?

1 个答案:

答案 0 :(得分:2)

Mongoose模型不纯(它们依赖于基础设施,而某些方法 - 如save - 有副作用)。我不认为你可以使用这个库拥有100%纯DDD架构。

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

以下是MongoDB Javascript driver

的附加内容

Mongo数据库数据类型

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

  • Float是一个8字节,可以直接转换到Javascript类型号

  • Double class一个表示浮点值的特殊类,在使用上限集合时尤其有用,您需要确保值始终为浮点数。

  • 整数有点棘手,因为Javascript将所有数字表示为64位浮点数,这意味着最大整数值为53位。 Mongo有两种类型的整数,32位和64位。如果可以,驱动程序将尝试将值拟合为32位,如果必须,则将其提升为64位。类似地,如果可以,它将反序列化尝试将其拟合为53位。如果不能,它将返回Long的实例,以避免失去精度。

  • Long class是一个特殊的类,它允许您存储64位整数,并允许您操作64位整数。

  • 日期直接映射到Javascript日期

  • RegExp 直接映射到Javascript RegExp

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

  • 二进制类是一个允许您在Mongo DB中存储数据的特殊类 Code类是一个特殊的类,它允许你在Mongo DB中存储javascript函数,也可以提供一个范围来运行该方法

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

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

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