# MongoDB
# MongoDB支持
TypeORM 具有基本的 MongoDB 支持。 TypeORM 大多数功能都是特定于 RDBMS 的, 此页面包含了所有 MongoDB 特定的功能文档。
# 定义实体和列
定义实体和列几乎与关系数据库中的相同,主要区别在于你必须使用@ObjectIdColumn
而不是@PrimaryColumn
或@PrimaryGeneratedColumn
。
简单实体示例:
import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
@Entity()
export class User {
@ObjectIdColumn()
id: ObjectID;
@Column()
firstName: string;
@Column()
lastName: string;
}
2
3
4
5
6
7
8
9
10
11
12
13
这里是你的应用程序如何连接到 MongoDB:
import { createConnection, Connection } from "typeorm";
const connection: Connection = await createConnection({
type: "mongodb",
host: "localhost",
port: 27017,
database: "test"
});
2
3
4
5
6
7
8
# 定义subdocuments(embed documents)
由于 MongoDB 存储对象和对象内的对象(或文档内的文档),因此你可以在 TypeORM 中执行相同的操作:
import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
export class Profile {
@Column()
about: string;
@Column()
education: string;
@Column()
career: string;
}
2
3
4
5
6
7
8
9
10
11
12
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;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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[];
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
如果保存此实体:
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);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以下文档将保存在数据库中:
{
"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
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用MongoEntityManager
和MongoRepository
你可以使用EntityManager
中的大多数方法(除了特定于 RDBMS 的方法,如query
和transaction
)。
例如:
import { getManager } from "typeorm";
const manager = getManager(); // 或者 connection.manager
const timber = await manager.findOne(User, { firstName: "Timber", lastName: "Saw" });
2
3
4
对于 MongoDB,还有一个单独的MongoEntityManager
,它扩展了EntityManager
。
import { getMongoManager } from "typeorm";
const manager = getMongoManager(); // 或者 connection.mongoManager
const timber = await manager.findOne(User, { firstName: "Timber", lastName: "Saw" });
2
3
4
就像MongoEntityManager
的EntityManager
一样,MongoRepository
也扩展了Repository
:
import { getMongoRepository } from "typeorm";
const userRepository = getMongoRepository(User); // 或者 connection.getMongoManager
const timber = await userRepository.findOne({ firstName: "Timber", lastName: "Saw" });
2
3
4
MongoEntityManager
和MongoRepository
都包含许多有用的 MongoDB 特定方法:
# createCursor
为查询创建一个游标,可用于迭代 MongoDB 的结果。
# createEntityCursor
为查询创建一个游标,可用于迭代 MongoDB 的结果。 这将返回游标的修改版本,该版本将每个结果转换为实体模型。
# aggregate
针对集合执行 aggregation framework 管道。
# bulkWrite
在没有连贯 API 的情况下执行 bulkWrite 操作。
# count
计算 db 中与查询匹配的文档的数量。
# createCollectionIndex
在 db 和 collection 上创建索引。
# createCollectionIndexes
在集合中创建多个索引,此方法仅在 MongoDB 2.6 或更高版本中受支持。 早期版本的 MongoDB 会抛出命令不支持的错误。 索引规范在http://docs.mongodb.org/manual/reference/command/createIndexes/中定义。
# deleteMany
删除 MongoDB 上的多个文档。
# deleteOne
删除 MongoDB 上的文档。
# distinct
distinct 命令返回集合中给定键的不同值列表。
# dropCollectionIndex
从此集合中删除索引。
# dropCollectionIndexes
删除集合中的所有索引。
# findOneAndDelete
查找文档并在一个 atomic 操作中将其删除,在操作期间需要写入锁定。
# findOneAndReplace
查找文档并在一个 atomic 操作中替换它,在操作期间需要写入锁定。
# findOneAndUpdate
查找文档并在一个 atomic 操作中更新它,在操作期间需要写入锁定。
# geoHaystackSearch
使用集合上的 geo haystack 索引执行 geo 搜索。
# geoNear
执行 geoNear 命令以搜索集合中的项目。
# group
跨集合运行组命令。
# collectionIndexes
检索集合上的所有索引。
# collectionIndexExists
检索集合中是否存在索引
# collectionIndexInformation
检索此集合索引信息
# initializeOrderedBulkOp
启动按顺序批量写入操作,将按添加顺序连续执行操作,为类型中的每个开关创建新操作。
# initializeUnorderedBulkOp
启动乱序批量写入操作。 所有操作都将缓冲到无序执行的 insert/update/remove 命令中。
# insertMany
将一组文档插入 MongoDB。
# insertOne
将单个文档插入 MongoDB。
# isCapped
如果集合是上限集合,则返回。
# listCollectionIndexes
获取集合的所有索引信息的列表。
# mapReduce
在集合中运行 Map Reduce。 请注意,out 的内联选项将返回结果数组而不是集合。
# parallelCollectionScan
为集合返回 N 个并行游标,允许并行读取整个集合。 返回的结果没有顺序保证。
# reIndex
重新索引集合上的所有索引警告:reIndex 是一个阻塞操作(索引在前台重建),对于大型集合来说速度很慢。
# rename
更改现有集合的名称。
# replaceOne
替换 MongoDB 上的一个文档。
# stats
获取所有集合的统计信息。
# updateMany
根据过滤器更新集合中的多个文档。
# updateOne
根据过滤器更新集合中的单个文档。