La risposta a questo dipende davvero da cosa intendi fare con i dati che stai archiviando in mongodb. È importante ricordare che un ReferenceField punterà a un documento in un'altra raccolta in mongodb, mentre un EmbeddedDocument è archiviato nello stesso documento nella stessa raccolta.
Considera questo schema:
Person
-> name
-> address
Address
-> street
-> city
-> country
Se prevedi che ogni persona abbia un solo indirizzo e che ogni indirizzo sia associato a una sola persona (una relazione uno-a-uno) e generalmente interrogherai il database per una o più Person documenti, quindi il campo Person.address dovrebbe essere EmbeddedDocumentField .
Se prevedi che ogni persona abbia più di un indirizzo, ma ogni indirizzo sarà associato a una sola persona (una relazione uno-a-molti) e continuerai a interrogare principalmente una Persona, puoi utilizzare un EmbeddedDocumentListField .
Se ti aspetti che ogni persona abbia più di un indirizzo e ogni indirizzo sarà associato a molte persone (una relazione molti-a-molti), probabilmente dovresti usare ReferenceField .
Tuttavia, anche se sei uno a uno o uno a molti, se l'Address fa parte del tuo modello di dati che è di interesse, quindi potrebbe essere vantaggioso averlo archiviato nella propria raccolta perché semplifica l'aggregazione e l'indicizzazione.
Un altro punto da considerare è che, a meno che tu non lo giri spento
mongoengine de-reference ogni ReferenceField quando recuperi un documento, ciò potrebbe introdurre penalità di prestazioni con molti ReferenceField o riferimenti a documenti molto grandi.