[英]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,以便经过身份验证的用户可以对该_id进行查询,例如GET,PUT和PATCH。
MongoDB具有支持,允许您生成自己的BSON ID并使用它,而不是mongodb在插入过程中创建它自己的_id。
有没有必要重复的逻辑,_id的主要目的是分别确定每个文档并且具有两个ID列意味着你存储的冗余数据,遵循DRY(不要重复自己)原则上尽可能。
在后端使用_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.