【问题标题】:save value of type object to MongoDB using TypeORM使用 TypeORM 将类型对象的值保存到 MongoDB
【发布时间】:2020-05-29 05:02:23
【问题描述】:

我想使用 TypeORM 将键值对存储到 MongoDB。我的后端 API 是用 NestJs 制作的(不确定这是否重要)。键是string 类型,值是object 类型,因为我想将任何东西存储到这个对象。

这是我的 TypeORM 数据库配置

TypeOrmModule.forRoot({
  type: 'mongodb',
  host: 'localhost',
  port: 27017,
  database: 'nest',
  entities: [`${__dirname}/**/*.entity.{ts,js}`],
  synchronize: true,
}),

我的映射实体不会自动生成密钥,因为我想自己设置它

@Entity()
export class Mapping extends BaseEntity {
  @PrimaryColumn()
  key: string;

  @Column()
  value: object;
}

当我想将新映射保存到数据库时,我会运行此逻辑(在哪里都无所谓)

  const newMapping: Mapping = new Mapping();
  newMapping.key = 'foobar';
  newMapping.value = { foo: 'bar' };
  await newMapping.save();

我收到了这个错误

TypeError: 无法读取未定义的属性“propertyName”

在执行数据库实体的save 函数时。看来我无法将object 类型的值存储到数据库中。有什么解决办法吗?

【问题讨论】:

  • 如果将 id 列从 key 重命名为 id 会怎样?
  • 嘿,我更新了我的代码,现在使用 id 而不是 key。不幸的是,错误仍然存​​在
  • 你能把装饰器从PrimaryColumn改成ObjectIdColumn吗?

标签: mongodb nestjs typeorm


【解决方案1】:

使用 TypeORM + Mongo 时,您的实体的 ID 列必须使用 ObjectIdColumn 装饰器进行装饰,例如

从“typeorm”导入{Entity, ObjectID, ObjectIdColumn, Column};

@Entity()
export class Mapping {

    @ObjectIdColumn()
    key: ObjectID;

    @Column()
    value: ;
}

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

TypeORM Mongo Docs

【讨论】:

  • 谢谢。问题是我想用字符串手动分配key。由于Type 'string' is not assignable to type 'ObjectID' 任何想法,无法再将key 分配给该字段?
  • 2.我认为@ObjectIdColumn({ generated: false }) 应该禁用自动生成。但必须在测试前解决第一个问题:)
  • 嗯,我目前用这个解决方案 @Entity() export class Mapping extends BaseEntity { @ObjectIdColumn() id: ObjectID; @Column() key: string; @Column() value: object; } 解决了它,但我不确定这是否是一个好的解决方案......
  • @hrp8sfH4xQ4 我认为您也可以将您的列添加为@ObjectIdColumn() key: string 或类似的名称,与@ObjectIdColumn() id: ObjectID 字段一起使用。但是,如果这样做,则在查询和保存时始终必须指定 key 值。
  • 那么您介意为该实体显示一个简单的 sn-p 吗?你想让我有两个唯一的标识符吗?
【解决方案2】:

您可以尝试 NestJS 对 MongoDB 的支持。

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

改为尝试使用 NestJS 方法。他们为 MongoDB 构建了一个模块,它需要编写更多的代码,但比 Typeorm 更适合 mongo。它使用 npm mongoose 包。我目前正在使用它,效果很好,实施起来并不难。

这是他们在 NestJS / MongoDB 上的文档。 MongoDB | NestJS

希望对你有帮助!

【讨论】:

  • 嗯,是的,谢谢。我只是尝试了它们并认为 typeorm 更适合我......我必须设计一个实体,而猫鼬我必须设计一个界面、一个模式等等......
  • 我也是这样做的,但后来我需要分页和其他猫鼬插件,我不能用 typeorm 这么简单,所以我做了这个交易并使用猫鼬.. Typeorm 说在未来他们将尝试使他们的包裹对 mongo 更友好。无论如何,一切都适合你!祝你好运!
猜你喜欢
  • 2021-03-10
  • 2021-07-26
  • 1970-01-01
  • 2021-12-02
  • 2015-02-08
  • 2020-09-01
  • 2020-11-08
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多