跳转到主要内容

mongodb

MongoDB 支持

TypeORM 对 MongoDB 有基本的支持。 大部分 TypeORM 的功能是针对关系型数据库的, 本页面包含了所有 MongoDB 特定功能的文档。

定义实体和字段

定义实体和字段的方式与关系型数据库几乎相同, 主要的区别在于您必须使用 @ObjectIdColumn, 而不是 @PrimaryColumn@PrimaryGeneratedColumn

以下是一个简单的实体示例:

import { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

@Entity()
export class User {
@ObjectIdColumn()
id: ObjectId

@Column()
firstName: string

@Column()
lastName: string
}

以下是如何启动应用程序:

import { DataSource } from "typeorm"

const myDataSource = new DataSource({
type: "mongodb",
host: "localhost",
port: 27017,
database: "test",
})

定义子文档(嵌入文档)

由于 MongoDB 存储对象和对象内的对象(或文档内的文档), 因此您可以在 TypeORM 中实现相同的功能:

import { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

export class Profile {
@Column()
about: string

@Column()
education: string

@Column()
career: string
}
import { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

export class Photo {
@Column()
url: string

@Column()
description: string

@Column()
size: number

constructor(url: string, description: string, size: number) {
this.url = url
this.description = description
this.size = size
}
}
import { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

@Entity()
export class User {
@ObjectIdColumn()
id: ObjectId

@Column()
firstName: string

@Column()
lastName: string

@Column((type) => Profile)
profile: Profile

@Column((type) => Photo)
photos: Photo[]
}

如果保存这个实体:

import { getMongoManager } from "typeorm"

const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.profile = new Profile()
user.profile.about = "About Trees and Me"
user.profile.education = "Tree School"
user.profile.career = "Lumberjack"
user.photos = [
new Photo("me-and-trees.jpg", "Me and Trees", 100),
new Photo("me-and-chakram.jpg", "Me and Chakram", 200),
]

const manager = getMongoManager()
await manager.save(user)

将保存以下文档到数据库中:

{
"firstName": "Timber",
"lastName": "Saw",
"profile": {
"about": "About Trees and Me",
"education": "Tree School",
"career": "Lumberjack"
},
"photos": [
{
"url": "me-and-trees.jpg",
"description": "Me and Trees",
"size": 100
},
{
"url": "me-and-chakram.jpg",
"description":"Me and Chakram",
"size": 200
}
]
}

使用 MongoEntityManagerMongoRepository

您可以使用大多数 EntityManager 中的方法(除了特定于 RDBMS 的方法,如 querytransaction)。 例如:

const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})

对于 MongoDB,还有一个单独的 MongoEntityManager,它扩展了 EntityManager

const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})

就像有单独的 MongoEntityManager 一样,还有一个带有扩展 RepositoryMongoRepository

const timber = await myDataSource.getMongoRepository(User).findOneBy({
firstName: "Timber",
lastName: "Saw",
})

find() 中使用高级选项:

等于:

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $eq: "Timber" },
},
})

小于:

const timber = await myDataSource.getMongoRepository(User).find({
where: {
age: { $lt: 60 },
},
})

包含:

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $in: ["Timber", "Zhang"] },
},
})

不包含:

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $not: { $in: ["Timber", "Zhang"] } },
},
})

或:

const timber = await myDataSource.getMongoRepository(User).find({
where: {
$or: [{ firstName: "Timber" }, { firstName: "Zhang" }],
},
})

查询子文档:

const users = await myDataSource.getMongoRepository(User).find({
where: {
"profile.education": { $eq: "Tree School" },
},
})

查询子文档数组:

// 查询图片大小小于500的用户
const users = await myDataSource.getMongoRepository(User).find({
where: {
"photos.size": { $lt: 500 },
},
})

MongoEntityManagerMongoRepository 都包含许多有用的 MongoDB 特定方法:

createCursor

创建用于查询的游标,可用于在 MongoDB 中遍历结果。

createEntityCursor

创建用于查询的游标,可用于在 MongoDB 中遍历结果。返回的游标是修改版的,将每个结果转换为实体模型。

aggregate

对集合执行聚合框架管道。

bulkWrite

执行批量写入操作,不使用流畅的 API。

count

计算数据库中与查询匹配的文档数。

createCollectionIndex

在数据库和集合上创建索引。

createCollectionIndexes

在集合中创建多个索引,此方法仅支持 MongoDB 2.6 或更高版本。 早期版本的 MongoDB 将引发不支持的命令错误。索引规范的定义参见 http://docs.mongodb.org/manual/reference/command/createIndexes/。

deleteMany

在 MongoDB 中删除多个文档。

deleteOne

在 MongoDB 中删除一个文档。

distinct

使用给定键在集合中获取不同值的列表。

dropCollectionIndex

从集合中删除索引。

dropCollectionIndexes

从集合中删除所有索引。

findOneAndDelete

在 MongoDB 中查找并删除一个文档,这是一个原子操作,需要在操作期间获得写锁。

findOneAndReplace

在 MongoDB 中查找并替换一个文档,这是一个原子操作,需要在操作期间获得写锁。

findOneAndUpdate

在 MongoDB 中查找并更新一个文档,这是一个原子操作,需要在操作期间获得写锁。

geoHaystackSearch

使用 MongoDB 中的地理散点索引执行地理搜索。

geoNear

执行 geoNear 命令以在集合中搜索项目。

group

在集合上运行 group 命令。

collectionIndexes

检索集合上的所有索引。

collectionIndexExists

检查集合上是否存在索引。

collectionIndexInformation

检索此集合的索引信息。

initializeOrderedBulkOp

启动按顺序的批量写操作,操作将按照添加顺序顺序执行,对于类型切换,将为每个操作创建一个新的操作。

initializeUnorderedBulkOp

启动无序的批量写操作。所有操作将缓冲到无序的插入/更新/删除命令中,并且无序执行。

insertMany

将一个文档数组插入到 MongoDB 中。

insertOne

将一个文档插入到 MongoDB 中。

isCapped

返回集合是否为固定大小的集合。

listCollectionIndexes

获取集合的所有索引信息。

parallelCollectionScan

为集合返回 N 个并行的游标,允许并行读取整个集合。返回结果的顺序没有保证。

reIndex

重新索引集合中的所有索引。警告:reIndex 是一个阻塞操作(索引在前台重建),对于大型集合来说速度很慢。

rename

更改现有集合的名称。

replaceOne

在 MongoDB 中替换一个文档。

stats

获取集合的统计信息。

updateMany

根据筛选条件在集合中更新多个文档。

updateOne

根据筛选条件在集合中更新一个文档。