首页 > 解决方案 > 如何通过 REST API GET 调用引用 mongodb 数据库中的 _id 字段?

问题描述

这很难解释,所以请多多包涵。

我有一个基于 Nestjs 的服务器,它使用 MongoDB 作为后端。以下是 mongodb 集合中的三个条目:

{"_id":{"$oid":"5e87ef7a9cf8648fac6b9f1e"},"complete":false,"editMode":false,"createdAt":{"$date":{"$numberLong":"1585966970857"}},"createdBy":"user","isDeleted":false,"title":"Make a birthday cake","note":"Make sure she poops."}
{"_id":{"$oid":"5e87f081237c70a6782d6c2a"},"createdAt":{"$date":{"$numberLong":"1585967233825"}},"createdBy":"user","isDeleted":false,"complete":false,"editMode":false,"title":"Clean the kitchen","note":"Use Lysol"}
{"_id":{"$oid":"5e87f73be81d7e0061311187"},"createdAt":{"$date":{"$numberLong":"1585968955971"}},"createdBy":"user","isDeleted":false,"complete":false,"editMode":false,"title":"Walk the dog","note":"Make sure she poops."}

这是我的模型:

@Entity()
export class Todo {
  @ObjectIdColumn()
  @Transform(value => value.toString(), { toPlainOnly: true })
  id: ObjectID;

  @Column({ length: 100 })
  title: string;

  @Column({ length: 5000 })
  note: string;

  @Column()
  complete: boolean;

  @Column()
  editMode: boolean;

  @Exclude() @Column() createdAt: Date = new Date();
  @Exclude() @Column() createdBy: string = 'user';
  @Exclude() @Column() isDeleted: boolean = false;
}

这是我的 GET-er 东西:

  @Get(':id')
  async getTodo(@Param('id') id: number) {
    return this.todosService.getTodo(id);
  }


  async getTodo(id: number): Promise<Todo | undefined> {
    return this.todosRepository.findOne(id, {
      where: {
        isDeleted: false,
      },
    });
  }

我想运行一个 REST GET 调用来检索其中一个文档,比如第三个文档。因此我在浏览器中调用:

http://localhost:3000/todos/5e87f73be81d7e0061311187

好吧,这将返回第一个文档。事实上,我调用的任何东西都只返回第一个文档。

我的 GET 调用应该是什么来获取第三个项目?

我可以提供任何可能需要的进一步信息。

标签: mongodbrestnestjs

解决方案


首先,我认为 id 参数(id:数字)应该是一个字符串。此外,findone 在第一个参数本身中获取所有查询参数(至少在 JS 中),所以它应该像 todoRepository.findOne({_id .$oid: string, isDeleted: false })。你能告诉我什么是$oid吗?ObjectId 类型?我没有使用nest.js/ typescript。根据这一点,您可能希望改进查询参数中的 $oid。


推荐阅读