2017-04-05 75 views
1

我打算爲我的MongoDB模式設計使用嵌套的文檔結構,因爲我不想去平面模式設計,因爲在我的情況下,我需要僅在一個查詢中獲取我的結果。在mongodb中使用嵌套的文檔結構

由於MongoDB具有文檔的大小限制。 MongoDB Limits and Threshold

A MongoDB document has a size limit of 16MB (an amount of data). If your subcollection can growth without limits go flat.

我不需要去找我嵌套的數據,但只需要我的嵌套的數據進行過濾和查詢的目的。

我想知道我是否仍然受MongoDB大小限制的約束,即使我僅將我的嵌入數據用於查詢和過濾目的,並且從不用於獲取嵌套數據,因爲按照我的理解,在這種情況下,MongoDB將不會加載整個文檔在內存中,但只有選定的領域?

嵌套架構設計例如

{ 
    clinicName: "XYZ Hopital", 
    clinicAddress: "ABC place.", 
    "doctorsWorking":{ 
     "doctorId1":{ 
      "doctorJoined": ISODate("2017-03-15T10:47:47.647Z") 
     }, 
     "doctorId2":{ 
      "doctorJoined": ISODate("2017-04-15T10:47:47.647Z") 
     }, 
     "doctorId3":{ 
      "doctorJoined": ISODate("2017-05-15T10:47:47.647Z") 
     }, 
     ... 
     ... 
     //upto 30000-40000 more records suppose 
    } 
} 

回答

1

我不覺得當你說「因爲按我的理解,在這種情況下,MongoDB的不會加載你的理解是正確的完整的文件在內存中,但只有選定的字段?「。

如果我們看到MongoDB Doc。那麼它讀取

最大BSON文檔大小是16兆字節。最大文檔大小有助於確保單個文檔不能使用過量的RAM,或者在傳輸過程中使用過多的帶寬。爲了存儲大於最大大小的文檔,MongoDB提供了GridFS API。

因此,文檔大小的明確限制是16 MB。 Mongo應該阻止您保存大於此大小的文檔。

如果我同意你的理解一段時間,我們假設它允許 保存任意大小的文檔,但不允許超過16MB的RAM。但另一方面,在存儲數據時,它不知道將對這些數據運行哪些查詢。所以最終你會插入一些以後不能使用的大文檔。 (因爲在插入時我們不告訴查詢模式,我們甚至可以嘗試在稍後的一個鏡頭中獲取完整的文檔)。

如果限制是傳輸(假設假設),那麼有很多方法(通過代碼)軟件開發人員可以將數據帶入集羣中的RAM,並且它們不會跨越16 MB限制(這就是他們如何執行IO操作在大文件上)。他們會嘲笑這個限制,讓它無用。我希望MongoDB的創建者知道它,並不希望它發生。

此外,如果傳輸限制,那麼將不會有任何需要單獨收集。我們可以將所有內容放在一個集合中,只需編寫智能查詢並獲取數據。如果獲取的數據跨越了16 MB,那麼將其部分取回並忘記限制。但它不會這樣。

因此,限制必須在文件大小上,否則會產生很多問題。

在我看來,如果您只是需要「醫生工作」數據來過濾或查詢目的(如果您還認爲「醫生工作」會導致文檔跨越16 MB的限制),那麼最好將它保存在單獨的集合中。

最終所有的東西都依賴於查詢和數據模式。如果一個醫生可以在多個醫院輪班服務,那麼將醫生分開收集是非常好的。

+0

感謝您花時間回答。 db.Clinic.update({「_ id」:ObjectId(「58e5e3ec54ccefdd4d85f638」)},{$ set:{「}我將不會加載整個文檔,但只是其中的一部分而不是像 ''db.Clinic.update doctorsWorking.doctor5 「:{ 」doctorJoined「:ISODate(」 2017-05-15T10:47:47.647Z「) } }}''' 使用這種方法只會更新特定領域提供 我。想知道的是,即使使用這種方法,或者只是其中一部分被更新,它是否會將完整的文檔加載到內存中? https://docs.mongodb.com/manual/reference/operator/update/set/ –

+1

@RobinsGupta MongoDB會知道整個文檔太大,並停止更新。 –

+0

@RobinsGupta它不允許超過16 MB的任何文檔。通過任何更新或通過插入或通過upsert。 –