La tua sfida deriva dal fatto che Prop_Info deve essere recuperato da entrambe le query. Questo rende difficile capire in quale collezione Mongo dovrebbe vivere.
In MongoDB, crei lo schema del tuo documento con l'obiettivo ideale che un singolo documento abbia tutte le informazioni di cui hai bisogno in base ai tuoi modelli di query. Nel caso in cui devi avere gli stessi dati D (come Prop_Info nel tuo caso) restituito da due query separate su due raccolte separate A e B , devi scegliere tra le seguenti tre strategie:
-
Duplica
Dnei documenti di entrambiAeBe imporre la coerenza con il codice. Questa è in genere la scelta progettuale di sistemi ad alte prestazioni che vogliono eliminare la necessità di una seconda query anche se ciò comporta il costo di un'ulteriore complessità del codice sul lato di inserimento/aggiornamento e con alcuni potenziali problemi di coerenza poiché Mongo non è ACID. -
Metti
DinAe memorizza un riferimento (DBRef o qualche altra combinazione di campi identificativi) inBin modo da poterlo ottenere con una seconda query. Questa è in genere la scelta di progettazione quando il numero di query suAsupera il numero di query aB. MantieneDlocale alla raccolta più frequentemente richiesta. In questo modello di progettazione dello schema devi solo eseguire una seconda query quando esegui una query suB. -
Metti
Din una nuova collezioneCed esegui una seconda query da entrambiAeB. Questa è in genere la scelta progettuale di fronte a requisiti futuri molto incerti in cui non è chiaro quali sarebbero i compromessi se si sceglie (1) o (2) sopra. È lo schema più "relazionale" e quello che ti costringerà a fare una seconda query quando esegui una query su entrambiAeB.
La strategia che scegli dipende dal tuo dominio, dai modelli di query, dal supporto che ottieni dal tuo framework di mappatura relazionale a oggetti (ORM) (se ne usi uno) e, ultimo ma non meno importante, dalle tue preferenze.
Nelle situazioni che ho incontrato, non ho mai scelto (3). Ho usato (1) in situazioni ad alte prestazioni (sistemi analitici). Ho usato (2) ovunque poiché i modelli di accesso alle query hanno reso ovvio dove dovrebbero risiedere i dati "condivisi".
Una volta scelta la strategia, se hai ancora bisogno di assistenza, pubblica un'altra domanda SO che si concentri specificamente sul problema di progettazione dello schema data la strategia scelta.
Tre consigli finali:
-
Se i dati condivisi
Dha una molteplicità di relazioni maggiore di 1 usa un array. È possibile indicizzare interi array e interrogare con precisione all'interno degli array utilizzando$elemMatch. -
Per aggiornare
Dnella strategia (1) o (2) utilizzare il modificatore atomico operazioni , molti dei quali sono progettati per funzionare su array. -
Questa domanda SO copre il modello di query a due DBRef nella risposta di @Stennie. (@Stennie funziona per 10gen, i marcatori di MongoDB.)
Buona fortuna!