使用 id vs _id 实现用户记录的正确方法

Posted

技术标签:

【中文标题】使用 id vs _id 实现用户记录的正确方法【英文标题】:Proper way to implement a User record with id vs _id 【发布时间】:2020-12-18 12:00:57 【问题描述】:

我无法理解实现 MongoDB 用户记录类型以与 GraphQL 一起使用的正确方法。具体来说,它与用户 ID 有关。

我希望能够查询用户记录并获取用户 ID 作为“ID”。 MongoDB 记录默认有一个 _id。

我该如何做到这一点?

我是否必须将用户记录定义为:

type User 
  id: ID!
  name: String!
  email: String!

我应该在创建记录时自己填充“id”字段吗?

或者我应该只使用 _id 作为用户 ID?如果是这样,我该如何查询?我收到问题说我无法查询它。我想是因为它不在 typedef 中。

【问题讨论】:

您需要在您的应用程序中映射它。如果您使用的是框架,请查看它是否支持此类映射。 我正在使用:apollo-server-express、passport、graphql 和 mongodb。我确实注意到 mongodb 有“虚拟”的概念。但我不确定如何使用 mongoDb 模式映射 graphql typeDef 。我希望不必将 id 存储为字符串,因为 _id 已经存在。 没有相关教程?尚未解决的问题?真的吗? 很可能是这样。但在过去的几天里,我一直在研究这个。人们使用不同的服务器等以多种不同的方式进行操作。我可以通过在其自己的“id”字段中声明 id 并在创建后复制 _id 值来使其工作。不过,它并没有真正回答我的问题。因为我现在将 _id 复制到 id 中。 您使用的哪个库中的 graphql 到 mongodb 映射? 【参考方案1】:

我将 TypeGraphQL 与 TypeORM 一起使用,您可以使用装饰器创建映射:

  @Field(type => ID!,  name: 'id' )
  @Column( type: '_id', nullable: false, unique: true )
  public _id: string;

【讨论】:

以上是关于使用 id vs _id 实现用户记录的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

架构师成长记_第八周_08_ES-文档的基本操作

架构师成长记_第八周_08_ES-文档的基本操作

redis存储用户历史浏览记录

基于 _id 字段操作 ref'd mongo 记录

delete_all vs destroy_all?

PHP获取MySql新增记录ID值的方法