EmbeddedDocument
將允許將文檔存儲在另一個文檔中,而RefereneField
只是存儲它的引用。但是,他們正在實現類似的目標。他們有特定的用例嗎?MongoEngine:EmbeddedDocument v/s。 ReferenceField
PS: SO上已經有question,但沒有好的答案。
EmbeddedDocument
將允許將文檔存儲在另一個文檔中,而RefereneField
只是存儲它的引用。但是,他們正在實現類似的目標。他們有特定的用例嗎?MongoEngine:EmbeddedDocument v/s。 ReferenceField
PS: SO上已經有question,但沒有好的答案。
對此的回答實際上取決於您打算如何處理您在mongodb中存儲的數據。請注意,ReferenceField
將指向另一個mongodb集合中的文檔,而EmbeddedDocument
存儲在同一個集合中的同一文檔中。
考慮這樣的模式:
Person
-> name
-> address
Address
-> street
-> city
-> country
如果你希望每個人都只有一個地址,每個地址只能與一個人有關(一比一的關係)和你一般要查詢一個或多個Person
文檔的數據庫,然後Person.address字段應爲EmbeddedDocumentField
。
如果您希望每個人都有多個地址,但每個地址只與一個人關聯(一對多關係),並且您仍然主要查詢某個人,那麼您可以使用EmbeddedDocumentListField
。
如果您希望每個人都有多個地址,並且每個地址都會與很多人關聯(多對多關係),您可能應該使用ReferenceField
。
但是,即使您是一對一或一對多的,如果Address
是您感興趣的數據模型的一部分,那麼將它存儲在它自己的集合中可能是有利的,因爲它使聚合和索引更容易。其他
有一點要考慮的是,除非你turn it off mongoengine會去參考每個ReferenceField
在獲取文件 - 這可能會帶來的性能損失,有很多的ReferenceField
或引用非常大的文檔。
這實際上是關於您在MongoDB中的集合的模式設計。通常取決於不同的因素,如關係的基數,訪問數據的方式或文檔的大小。這在官方MongoDB's blog中有很好的例子,我建議你看看它。
如果你想在你的項目中使用'RefereceField',你可能應該考慮使用Django ORM和[連接到MongoDB](https://nesdis.github.io/djongo/),而不是使用MongoEngine 。 – nesdis