Как обратиться к полю _id в базе данных mongodb через вызов REST API GET? - PullRequest
0 голосов
/ 04 апреля 2020

Это сложно объяснить, поэтому, пожалуйста, потерпите меня.

У меня есть сервер на основе Nest js, который использует 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, чтобы получить третий предмет?

Я могу предоставить любую дополнительную информацию, которая может потребоваться.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Во-первых, я думаю, что параметр id (id: номер) должен быть строкой. Кроме того, findone принимает все параметры запроса в самом первом аргументе (по крайней мере, в JS), поэтому он должен быть похож на todoRepository.findOne ({_ id. $ Oid: string, isDeleted: false}). Можете ли вы сказать мне, что такое $ oid? Тип ObjectId? Я не работал с nest.js / typcript. В зависимости от этого вы можете улучшить $ oid в аргументе запроса.

0 голосов
/ 04 апреля 2020

Вот ответ: Сделайте параметр id типом ObjectID везде в приложении.

Например:

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


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

После того, как я это сделал, все заработало как ожидается.

...