2016-01-20 24 views
2

EmbeddedDocument將允許將文檔存儲在另一個文檔中,而RefereneField只是存儲它的引用。但是,他們正在實現類似的目標。他們有特定的用例嗎?MongoEngine:EmbeddedDocument v/s。 ReferenceField

PS: SO上已經有question,但沒有好的答案。

+0

如果你想在你的項目中使用'RefereceField',你可能應該考慮使用Django ORM和[連接到MongoDB](https://nesdis.github.io/djongo/),而不是使用MongoEngine 。 – nesdis

回答

5

對此的回答實際上取決於您打算如何處理您在mongodb中存儲的數據。請注意,ReferenceField將指向另一個mongodb集合中的文檔,而EmbeddedDocument存儲在同一個集合中的同一文檔中。

考慮這樣的模式:

Person 
    -> name 
    -> address 

Address 
    -> street 
    -> city 
    -> country 

如果你希望每個人都只有一個地址,每個地址只能與一個人有關(一比一的關係)和你一般要查詢一個或多個Person文檔的數據庫,然後Person.address字段應爲EmbeddedDocumentField

如果您希望每個人都有多個地址,但每個地址只與一個人關聯(一對多關係),並且您仍然主要查詢某個人,那麼您可以使用EmbeddedDocumentListField

如果您希望每個人都有多個地址,並且每個地址都會與很多人關聯(多對多關係),您可能應該使用ReferenceField

但是,即使您是一對一或一對多的,如果Address是您感興趣的數據模型的一部分,那麼將它存儲在它自己的集合中可能是有利的,因爲它使聚合和索引更容易。其他

有一點要考慮的是,除非你turn it off mongoengine會去參考每個ReferenceField在獲取文件 - 這可能會帶來的性能損失,有很多的ReferenceField或引用非常大的文檔。

1

這實際上是關於您在MongoDB中的集合的模式設計。通常取決於不同的因素,如關係的基數,訪問數據的方式或文檔的大小。這在官方MongoDB's blog中有很好的例子,我建議你看看它。

相關問題