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
}
]
}
使用 MongoEntityManager
和 MongoRepository
您可以使用大多数 EntityManager
中的方法(除了特定于 RDBMS 的方法,如 query
和 transaction
)。
例如:
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
一样,还有一个带有扩展 Repository
的 MongoRepository
:
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 },
},
})
MongoEntityManager
和 MongoRepository
都包含许多有用的 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
根据筛选条件在集合中更新一个文档。