MongoDB - _id 作為 String 而不是 ObjectId ?集合或重複數據之間的關係?
場景:一個叫做“accessPoint”的實體有一個叫做“network”的重要屬性。應用程序將顯示此網路屬性的某些部分,因此我決定將其儲存在 accessPoint 文件中。
我還決定將所有網路文件(帶有附加屬性)儲存在一個單獨的集合中(出於性能原因:它將用於前端的自動完成輸入)
accessPoint: { id: ObjectId, name: String, uptime: Number, network: { subnet: String, netmask: Number } } network: { _id: ObjectId subnet: String, netmask: Number, size: Number, validatedAt: Date, attrX: String, attrY: String, attrZ: String }
我有 3 個主要問題: 1 - 將網路儲存在單獨的集合中是一種好習慣嗎?(注意上面的要求)
2 - 在這兩個文件(如 SQL DBMS)之間建立關係是否存在任何合規/約定問題?
3 - 而且,我想知道……我可以將 _id 儲存為 String 而不是 ObjectId 嗎?我已經閱讀了一些建議,但我對此沒有決定性的意見。例如:(
... network: { _id: "192.168.1.0/24" }
保證唯一性:D)謝謝!
以下是對您的問題的一些澄清:
1 - 將網路儲存在單獨的集合中是一種好習慣嗎?(注意上面的要求)
這取決於您的應用程序功能和數據。
accessPoint
問題之一是這兩個實體之間的關係是什麼network
?是一對一、一對多還是多對多。下一個問題是,您的重要疑問是什麼?哪些查詢被頻繁訪問並且在使用者體驗、性能等方面很重要。
通常,一對一關係應該建模為單個文件。即
accessPoint
作為network
一份文件。請注意,每個 MongoDB 文件最多可以儲存 16 MB 的數據。一對多關係可以建模為單個實體,也可以建模為兩個實體。最好將相關資訊儲存在一起,以便可以一起訪問。
2 - 在這兩個文件(如 SQL DBMS)之間建立關係是否存在任何合規/約定問題?
引用或關係涉及兩個實體,在這種情況下是
network
相關資訊。理想情況下,它應該是
network
實體的唯一欄位。這意味著,將nework
實體的_id
欄位(也)儲存network
在accessPoint
. 這network._id
可以用作參考(或關係)欄位。MongoDB 聚合框架允許在相關集合之間“加入”查詢 - $lookup聚合階段允許這樣做。因此,如果您需要將兩個集合中的數據作為單個查詢訪問,請使用
$lookup
.訪問單個集合的查詢可以很容易地形成並且比使用聚合查詢執行得更好
$lookup
。3 - 而且,我想知道……我可以將 _id 儲存為 String 而不是 ObjectId 嗎?我已經閱讀了一些建議,但我對此沒有決定性的意見。例如:…網路:{_id:“192.168.1.0/24”}(保證唯一性:D)
_id
field 可以是任何 MongoDB BSON 類型,數組欄位類型除外。_id
關於該領域需要注意的其他重要事項是:
- 它必須是唯一的(此欄位上有一個預設且不可變的唯一索引)
- 它必須是不可變的(不能為文件更新或刪除此欄位值)。