Din udfordring kommer fra det faktum, at Prop_Info skal hentes af begge forespørgsler. Det gør det svært at finde ud af, hvilken Mongo-kollektion den skal bo i.
I MongoDB opretter du dit dokumentskema med det ideelle mål for et enkelt dokument at have al den information, du har brug for, givet dine forespørgselsmønstre. I det tilfælde, hvor du skal have de samme data D (såsom Prop_Info i dit tilfælde) returneret af to separate forespørgsler mod to separate samlinger A og B , skal du vælge mellem følgende tre strategier:
-
Dublet
Di dokumenterne til bådeAogB, og håndhæv overensstemmelse med din kode. Dette er typisk designvalget af højtydende systemer, der ønsker at eliminere behovet for en anden forespørgsel, selvom det kommer på bekostning af yderligere kodekompleksitet på indsætnings-/opdateringssiden og med nogle potentielle konsistensproblemer, da Mongo ikke er ACID. -
Indsæt
DiAog gem en reference (DBRef eller en anden kombination af identificerende felter) iBså du kan komme til det med en anden forespørgsel. Dette er typisk designvalget, når antallet af forespørgsler tilAoverstiger antallet af forespørgsler tilB. Den beholderDlokal til den hyppigst forespurgte samling. I dette skemadesignmønster behøver du kun at lave en anden forespørgsel, når du forespørgerB. -
Indsæt
Di en ny samlingCog lav en anden forespørgsel til den fra bådeAogB. Dette er typisk designvalget i lyset af meget usikre fremtidige krav, hvor det ikke er klart, hvad afvejningen ville være, hvis du går med (1) eller (2) ovenfor. Det er det mest "relationelle" skema og det, der vil tvinge dig til at lave en anden forespørgsel, når du forespørger bådeAogB.
Hvilken strategi du vælger afhænger af dit domæne, forespørgselsmønstrene, den støtte du får fra din object-relational mapping (ORM) framework (hvis du bruger en), og sidst men ikke mindst din præference.
I de situationer, jeg har mødt, har jeg aldrig valgt (3). Jeg har brugt (1) i højtydende situationer (analysesystemer). Jeg har brugt (2) alle andre steder, siden forespørgselsadgangsmønstrene har gjort det indlysende, hvor de "delte" data skal bo.
Når du har valgt din strategi, og hvis du stadig har brug for hjælp, kan du stille endnu et SO-spørgsmål, der specifikt fokuserer på skemadesignproblemet givet den valgte strategi.
Tre sidste tips:
-
Hvis de delte data
Dhar en relationsmultiplicitet større end 1 brug en matrix. Du kan indeksere hele arrays, og du kan forespørge præcist inde i arrays ved hjælp af >$elemMatch. -
For at opdatere
Di strategi (1) eller (2) brug MongoDB's atomare modifikator operationer , hvoraf mange er designet til at fungere på arrays. -
Dette SO-spørgsmål dækker DBRef to-forespørgselsmønsteret i @Stennies svar. (@Stennie arbejder for 10gen, markørerne for MongoDB.)
Held og lykke!