MongoDB

MongoDB支持

TypeORM 具有基本的 MongoDB 支持。 TypeORM 大多数功能都是特定于 RDBMS 的, 此页面包含了所有 MongoDB 特定的功能文档。

定义实体和列

定义实体和列几乎与关系数据库中的相同,主要区别在于你必须使用@ObjectIdColumn而不是@PrimaryColumn@PrimaryGeneratedColumn

简单实体示例:

  1. import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
  2. @Entity()
  3. export class User {
  4. @ObjectIdColumn()
  5. id: ObjectID;
  6. @Column()
  7. firstName: string;
  8. @Column()
  9. lastName: string;
  10. }

这里是你的应用程序如何连接到 MongoDB:

  1. import { createConnection, Connection } from "typeorm";
  2. const connection: Connection = await createConnection({
  3. type: "mongodb",
  4. host: "localhost",
  5. port: 27017,
  6. database: "test"
  7. });

定义subdocuments(embed documents)

由于 MongoDB 存储对象和对象内的对象(或文档内的文档),因此你可以在 TypeORM 中执行相同的操作:

  1. import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
  2. export class Profile {
  3. @Column()
  4. about: string;
  5. @Column()
  6. education: string;
  7. @Column()
  8. career: string;
  9. }
  1. import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
  2. export class Photo {
  3. @Column()
  4. url: string;
  5. @Column()
  6. description: string;
  7. @Column()
  8. size: number;
  9. constructor(url: string, description: string, size: number) {
  10. this.url = url;
  11. this.description = description;
  12. this.size = size;
  13. }
  14. }
  1. import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm";
  2. @Entity()
  3. export class User {
  4. @ObjectIdColumn()
  5. id: ObjectID;
  6. @Column()
  7. firstName: string;
  8. @Column()
  9. lastName: string;
  10. @Column(type => Profile)
  11. profile: Profile;
  12. @Column(type => Photo)
  13. photos: Photo[];
  14. }

如果保存此实体:

  1. import { getMongoManager } from "typeorm";
  2. const user = new User();
  3. user.firstName = "Timber";
  4. user.lastName = "Saw";
  5. user.profile = new Profile();
  6. user.profile.about = "About Trees and Me";
  7. user.profile.education = "Tree School";
  8. user.profile.career = "Lumberjack";
  9. user.photos = [
  10. new Photo("me-and-trees.jpg", "Me and Trees", 100),
  11. new Photo("me-and-chakram.jpg", "Me and Chakram", 200)
  12. ];
  13. const manager = getMongoManager();
  14. await manager.save(user);

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

  1. {
  2. "firstName": "Timber",
  3. "lastName": "Saw",
  4. "profile": {
  5. "about": "About Trees and Me",
  6. "education": "Tree School",
  7. "career": "Lumberjack"
  8. },
  9. "photos": [
  10. {
  11. "url": "me-and-trees.jpg",
  12. "description": "Me and Trees",
  13. "size": 100
  14. },
  15. {
  16. "url": "me-and-chakram.jpg",
  17. "description": "Me and Chakram",
  18. "size": 200
  19. }
  20. ]
  21. }

使用MongoEntityManagerMongoRepository

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

  1. import { getManager } from "typeorm";
  2. const manager = getManager(); // 或者 connection.manager
  3. const timber = await manager.findOne(User, { firstName: "Timber", lastName: "Saw" });

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

  1. import { getMongoManager } from "typeorm";
  2. const manager = getMongoManager(); // 或者 connection.mongoManager
  3. const timber = await manager.findOne(User, { firstName: "Timber", lastName: "Saw" });

就像MongoEntityManagerEntityManager一样,MongoRepository也扩展了Repository

  1. import { getMongoRepository } from "typeorm";
  2. const userRepository = getMongoRepository(User); // 或者 connection.getMongoManager
  3. const timber = await userRepository.findOne({ firstName: "Timber", lastName: "Saw" });

MongoEntityManagerMongoRepository都包含许多有用的 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

根据过滤器更新集合中的单个文档。