是否有可能将MongoDB ObjectID系统与MySql和typeORM一起使用,而不是使用增量ID?
目标是像这样定义我的实体:
@Entity()
export class RolePermission implements IRolePermission {
@ObjectIdColumn() id?: ObjectID;
@Column()
@IsNotEmpty()
roleId: ObjectID;
@Column()
@IsNotEmpty()
permissionId: ObjectID;
}
因此,我的实体即使没有持久化也可能具有ID。 ObjectId系统将防止在我想用于此列的唯一约束上发生冲突。
如果可以实施这样的系统,那么它们的性能会下降吗?我记得用PHP实现了这样的系统,当时,我读了这个响应,使我认为这是可以的:Is there a REAL performance difference between INT and VARCHAR primary keys?
答案 0 :(得分:1)
实际上非常简单。您只需要使用mongodb
包中的ObjectID对象,并像平常一样声明实体即可。
首先,安装mongodb依赖项:
yarn add mongodb
yarn add @types/mongodb
然后,声明您的实体。这是一个用户与文章之间具有工作关系的示例:
user.entity.ts
:
import { Entity, Column, ManyToOne, PrimaryColumn } from 'typeorm';
import { Article } from './article.entity';
import { ObjectID } from 'mongodb';
@Entity()
export class User {
constructor() {
this.id = (new ObjectID()).toString();
}
@PrimaryColumn()
id: string;
@Column({ length: 500 })
username: string = null;
@OneToMany(type => Article, article => article.user)
articles: Article[];
}
article.entity.ts
:
import { Entity, Column, ManyToOne, PrimaryColumn } from 'typeorm';
import { User } from './user.entity';
import { ObjectID } from 'mongodb';
@Entity()
export class Article {
constructor() {
this.id = (new ObjectID()).toString();
}
@PrimaryColumn()
id: string;
@Column({ length: 500 })
title: string = null;
@ManyToOne(type => User, user => user.articles, {nullable: true})
user: User;
}
并像平常一样使用它:
const user = new User();
user.username = 'email@adress.com';
const article = new Article();
article.title = 'Mon titre';
article.user = user;
await this.userRepository.save(user);
await this.articleRepository.save(article);