繁体   English   中英

如何在REST API中公开MongoDB文档的主键?

[英]How to expose MongoDB documents primary keys in a REST API?

我正在使用MongoDB + nodeJS构建REST API。 所有文档都已存储,并使用_id作为主键。 我在这里读到,我们不应该公开_id,而应该使用另一个非增量ID。

在数据库中,文档表示为:

{ 
   _id: ObjectId("5d2399b83e9148db977859ea")
   bookName: "My book"
}

对于以下端点,应如何公开文档?

GET /books
GET /books/{bookId}

目前,我的API返回:

{ 
   _id: "5d2399b83e9148db977859ea"
   bookName: "My book"
}

但它应该返回如下内容:

{ 
   id: "some-unique-id-generated-on-creation"
   bookName: "My book"
}

问题

  • 我是否应该公开_id以便进行如下查询:

    GET / books / 5d2399b83e9148db977859ea

  • 我应该使用UUID代替ID作为ID吗?

  • 我应该保留内部_id(但不要公开它)并创建另一个将使用UUID或另一个自定义生成的ID的属性ID吗?
  • 在后端使用_id是一种好习惯,还是仅使用自己的自定义ID进行查询? 示例:find({id:})而不是find({_id:})

回答您的问题。

  1. 您可以公开_id,以便经过身份验证的用户可以对该_id进行查询,例如GET,PUT和PATCH。

  2. MongoDB具有支持,允许您生成自己的BSON ID并使用它,而不是mongodb在插入过程中创建它自己的_id。

  3. 有没有必要重复的逻辑,_id的主要目的是分别确定每个文档并且具有两个ID列意味着你存储的冗余数据,遵循DRY(不要重复自己)原则上尽可能。

  4. 在后端使用_id并不是一个坏习惯。

希望这可以帮助!

假设您使用的是Mongoose,则可以使用“虚拟”,这实际上是Mongoose创建的伪字段。 它们没有存储在数据库中,只是在运行时填充:

// Duplicate the ID field.
Schema.virtual('id').get(function(){
    return this._id.toHexString();
});

// Ensure virtual fields are serialised.
Schema.set('toJSON', {
    virtuals: true
});

每当在您从此模式创建的模型上调用toJSON时,它将包含一个与Mongo生成的_id字段匹配的'id'字段。 同样,您可以以相同的方式为toObject设置行为。

您可以参考以下文档:
1) https://mongoosejs.com/docs/api.html
2) toObject方法

就我而言,是否存在安全风险,但是我的_id是文档中任何在语义上被视为关键字的字段的串联,即,如果我将名字,姓氏和电子邮件作为标识符,并且第四个字段,例如Age作为属性,则_id将是所有这三个字段的串联。 只要我有名字,姓氏和电子邮件信息,获取和更新此类记录就不会困难

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM