1. 前言
此篇文章用于记录使用 Typeorm
操作 MongoDB
的方法,方便后续再次使用时有记录总结,防止下次碰到类似问题时有得费心思查询思路。
mongodb 版本
:3.7.3
typeorm 版本
:0.2.45
@types/mongodb
:3.6
2. 了解 ObjectID
特性:
- 总体上为递增的顺序;
- 可以通过
ObjectID
获取时间信息; - JS 比对
ObjectID
时需要调用它的toString
方法;
3. 操作方法
3.1 基础查询
常用的 mongo 的操作符 |
含义 |
---|---|
$in & $nin |
数组匹配($in :匹配在数组内的; $nin :匹配不在数组内的) |
$or & $nor |
或操作符($or :匹配满足任一条件的; $nor :匹配任一条件均不满足的) |
$eq & $ne |
相等匹配($eq :等于; $ne :不等于) |
$gt & $lt |
大小匹配($gt :大于; $lt :小于) |
$not |
非操作符(需要配合别的操作符使用) |
$and |
与操作符($and :匹配满足所有条件的) |
1 | // $in 示例 |
当然,typeorm
也为我们简化了一部分的操作写法,特别是简单的匹配查询时,我们可以直接这么写:
1 | // 查询多条数据(返回数组) |
⚠️ 注:批量查询数据,需要根据
ObjectID
查询的时候,需要new ObjectID(str)
来生成对应的类型才可查询,可能和版本问题有关。
3.2 级联查询
这里的“级联查询”包括两部分的操作:“单表聚合”、“多表联查”。
3.2.1 单表聚合
⚠️ 注:表格内容引自后面 “参考文章 - 6”
常用管道 | 含义 |
---|---|
$group |
将 collection 中的 document 分组,可用于统计结果 |
$match |
过滤数据,只输出符合结果的文档 |
$project |
修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等) |
$sort |
将结果进行排序后输出 |
$limit |
限制管道输出的结果个数 |
$skip |
跳过制定数量的结果,并且返回剩下的结果 |
$unwind |
将数组类型的字段进行拆分 |
1 | // 一般操作方法 |
3.2.2 多表联查
多表联查我们需要用到的是 $lookup
操作符,此操作符内容如下:
from
:目标表localField
:当前表的匹配字段foreignField
:目标表的匹配字段as
:输出的集合名称
⚠️ 注:这里的
localField
与foreignField
就是两表关联的外键,注意别填反了。
1 | // 示例 |
3.3 新增操作
使用 Typeorm
操作 mongodb
的新增能力有三种方法:save
、insertOne
、insertMany
,一般我们使用 save
方法。它们之间稍微有一些区别:
3.3.1 save
方法
save
方法比较简单,直接将新增参数放入即可,支持自动生成 主键
、新增时间
、更新时间
,它同时支持插入单条数据 & 多条数据。
1 | // 插入单条数据 |
3.3.2 insertOne
方法
insertOne
方法为 save
的单条数据操作版,但它只支持自动生成 主键
,在项目使用上可优先使用 save
方法。
1 | this.repo.insertOne({ |
3.3.3 insertMany
方法
insertMany
方法为 save
的多条数据操作版,但它只支持自动生成 主键
,在项目使用上可优先使用 save
方法。
1 | this.repo.insertMany([ |
3.4 删除操作
删除方法基本都使用 delete
方法,使用方法基本按照 TS
定义去操作即可:
1 | // 可单、批量删除 |
3.5 更新操作
更新操作也有多种:update
、updateOne
、updateMany
,基本和 find 差不多,用的较多的基本是 update
方法,属于综合性更新。
1 | repo.update(tarId, { |
⚠️ 注:
typeorm
更新mongodb
时不会自动更新时间,需要手动补充时间的更新内容。