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

问题描述 投票:3回答:1

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

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

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

javascript node.js mongodb mongoose domain-driven-design
1个回答
2
投票

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

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

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

Mongodb数据类型

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

  • Float是一个8字节,可直接转换为Javascript类型Number
  • Double类是一个表示浮点值的特殊类,在使用上限集合时尤其有用,您需要确保值始终为浮点值。
  • 整数有点棘手,因为Javascript将所有数字表示为64位浮点数,这意味着最大整数值为53位。 Mongo有两种类型的整数,32位和64位。如果可以,驱动程序将尝试将值拟合为32位,如果必须,则将其提升为64位。类似地,如果可以,它将反序列化尝试将其拟合为53位。如果它不能,它将返回Long的实例,以避免失去精度。
  • Long class是一个特殊的类,它允许您存储64位整数,还允许您操作64位整数。
  • 日期直接映射到Javascript日期
  • RegExp直接映射到Javascript RegExp
  • 字符串直接映射到Javascript字符串(以utf8编码)
  • 二进制类是一个特殊的类,它允许你在Mongodb Code类中存储一个特殊的类,它允许你在Mongodb中存储javascript函数,也可以提供一个运行方法的范围
  • ObjectID类是一个包含MongoDB文档标识符的特殊类(相当于主键)
  • DbRef类是一个特殊的类,它允许您在指向另一个对象的文档中包含引用
  • Symbol类是一个特殊的类,它允许您指定符号,与JavaScript无关,但对于支持符号概念的语言。
© www.soinside.com 2019 - 2024. All rights reserved.