代码之家  ›  专栏  ›  技术社区  ›  apostrophedottilde

节点。js-从域模型中抽象mongoose模型

  •  7
  • apostrophedottilde  · 技术社区  · 7 年前

    我正在节点中构建rest API。我遵循通用ddd体系结构,即存储库、域模型、实体、价值对象等。 出于持久性的需要,我选择了montodb,并使用mongoose与dB引擎进行接口。

    在mongoose中,我们从定义的模式创建模型。 我正在试图找出如何将我的域模型与mongoose模型分离出来。我想实现值对象,但我不知道如何使用mongoose模型来实现。

    我在任何地方都找不到关于我如何做到这一点的任何信息。我想知道是不是我会建议你的。我可以向mongoose模型添加方法,所以我猜它是作为域模型。如果是这种情况,那么如何实现值对象?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Constantin Galbenu    7 年前

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

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

    以下是 MongoDB Javascript driver :

    Mongo DB数据类型

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

    • Float是一个8字节的 可直接兑换 到Javascript类型编号

    • Double class表示浮点值的特殊类,在使用capped集合时尤其有用,因为您需要确保值始终是浮点值。

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

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

    • 日期 直接映射 到Javascript日期

    • RegExp 直接映射 到Javascript RegExp

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

    • Binary类一个特殊的类,用于在Mongo DB中存储数据 Code class一个特殊的类,它允许您在Mongo DB中存储javascript函数,还可以提供在其中运行该方法的范围

    • ObjectID类保存MongoDB文档标识符(相当于主键)的特殊类

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

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