Zhi-Ling

You can do Everything you want

0%

MongoDB-ORM

Brief IntroTelling the differences among nodejs oriented mongodb orm frameworks

  • Mongoose
  • Prisma
  • TypeOrm
  • Sequelize

Mongoose

官网
Github

简介

Mongoose 是对 node 环境中 MongoDB 数据库操作的封装,一个对象模型工具,将数据库中的数据转换为 JavaScript 对象以供我们在应用中使用。

使用事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const register = async () => {
const session = await conn.startSession();
try {
session.startTransaction();
const user = await User.create([{ name: "Van Helsing" }], { session });
await ShippingAddress.create(
[{ address: "Transylvania", user_id: user.id }],
{ session }
);
await session.commitTransaction();
console.log("success");
} catch (error) {
console.log("error");
await session.abortTransaction();
}
session.endSession();
};

更多参考:

优点

  • 上手简单,面向 nodejs 和 mongoDB 的第一选择
  • 可以为文档创建一个模式结构(Schema)
  • 可以对模型中的对象 / 文档进行验证
  • 可以通过类型转换转换为对象模型
  • 可以使用中间件来应用业务逻辑挂钩
  • 比 node 原生驱动 MongoDB 更容易

Prisma

官网
Github

简介

Prisma 是一个开源的数据库工具链项目,帮助开发人员更快地构建应用程序并减少错误,支持 PostgreSQL、MySQL、MongoDB、SQL Server 和 SQLite。

使用事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var session = db.getMongo().startSession();

// start
session.startTransaction(
{ "readConcern": { "level": "snapshot" },
"writeConcern": { "w": "majority" }}
);

// run
var authors = session.getDatabase('literature').getCollection('authors')
authors.insertOne( {
"first_name": "Virginie",
"last_name": "Despentes",
"title": "Vernon Subutex")}
)
session.commitTransaction()

// Abort
session.abortTransaction()

官方文档: How-To-Use-Transaction

优点

  • 提供干净和类型安全的 API,小体积数据库查询,同时返回普通的 JS 对象,更容易进行数据库查询
  • 自带 CRUD 封装、提供 VSCode 扩展插件、语法高亮、智能自动补全
  • 文档详细全面,当前呼声较高,
  • 支持多个数据库。在 SQL 和 NoSQL 数据库之间移动时,这对开发人员来说是一个巨大的优势,因为只需要更改 Schema 文件。所有其他操作 / 查询保持不变
  • 对 TS 支持很好,当前主力维护是 ts-toolbelt 的作者 Pierre-Antoine Mills,prisma 会自动生成几乎所有的类型,会自动注入 ts-toolbelt
  • 背后是商业公司维护,不存在 typeOrm 断更的情况

缺点

  • 和 TypeOrm 一样,对 Mongo 的支持也停留在试验阶段
  • 不支持多个模型文件。所有模型都需要写入 schema.prisma 文件,这使得文件杂乱无章,难以调试和阅读
  • 目前没有嵌入式集合支持
  • 目前不支持 @@id 和自增

TypeOrm

官网
Github

简介

TypeORM 是一个运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo 和 Electron 平台上的一个 ORM 框架,可以与 TypeScript 和 JavaScript 一起使用。它的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的应用程序

支持语言

MySQL、MariaDB、PostgreSQL、SQLite、Microsoft SQL Server、sql.js、Oracle、MongoDB (试验性)、NativeScript, react-native  和  Cordova

优点

  • 同时支持 ActiceRecordDataMapper
  • 完美集成到 NestJs 框架
  • 对 TS 高度支持,简洁以及支持装饰器语法
  • 参考了其他优秀 ORM 的实现,例如 Hibernate,Doctrine 和 EntityFramework

缺点

  • 对 Mongo 数据库支持度是试验性的,后期支持度怎样具体不知
  • 近一年多未继续维护,存在一些坑,issue 积压较多
  • 没有特别完备的 API 文档,说明不清晰,只有教程和示例

Sequelize

官网
Github

缺点

  • 不支持 Mongo,直接 pass

几种 ORM 对比

其他参考

从 Mongoose 到 MongoDB 的 PrismaORM 之旅! > 使用 NestJS 和 Prisma 创建 REST API > NestJS 官网配置 Prisma > Using Prisma with MongoDB > Prisma 搭配使用 MongoDB 官方指南(中文指导版)

Welcome to my other publishing channels