在MySQL中使用MongoDB中的ObjectId

时间:2018-08-06 09:05:25

标签: typeorm

是否有可能将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?

1 个答案:

答案 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);