我正在节点中构建一个rest API。我遵循一般的ddd架构,即存储库,域模型,实体,值对象等。 我选择montodb来满足我的持久性需求,并使用mongoose与dB引擎接口。
在mongoose中,我们从定义的模式中创建模型。 我试图找出如何将我的域模型与猫鼬模型分开。我想实现价值对象,我不知道如何用猫鼬模型做到这一点。
我无法找到有关如何在任何地方执行此操作的任何信息。我想知道是不是我可能会建议。我可以为猫鼬模型添加方法,所以我猜它是一个域模型。如果是这种情况,那么我该如何实现值对象呢?
答案 0 :(得分:2)
Mongoose模型不纯(它们依赖于基础设施,而某些方法 - 如save
- 有副作用)。我不认为你可以使用这个库拥有100%纯DDD架构。
另一方面,使用普通的JavaScript对象作为具有MongoDB持久性的模型(实体,聚合和值对象)非常有意义。它们之间有100%的阻抗匹配。
的附加内容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无关,但支持符号概念的语言。