簡體   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