Som en ivrig mongodb-fan foreslår jeg, at du bruger en relationel database til meget relationelle data – det er det, den er bygget til. Du mister alle fordelene ved mongodb, når du skal udføre 3+ forespørgsler for at få et enkelt objekt.
Buuuuuut , Jeg ved, at den kommentar vil falde for døve ører. Dit bedste bud er at være så bevidst som du kan om ydeevne. Dit første skridt er at begrænse felterne til det krævede minimum. Dette er bare god praksis, selv med grundlæggende forespørgsler og enhver databasemotor - få kun de felter, du har brug for (f.eks. SELECT * FROM
===dårligt... bare stop med at gøre det!). Du kan også prøve at lave slanke forespørgsler for at spare en masse efterbehandlingsarbejde, som Mongoose udfører med dataene. Jeg testede ikke dette, men det burde virke...
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
name: 'fieldB',
select: 'fieldC',
options: { lean: true }
}).exec(function (err, result) {
// not sure how you are populating "result" in your example, as it should be an array,
// but you said your code works... so I'll let you figure out what goes here.
});
Også en meget "mongo" måde at gøre det, du vil, er at gemme en reference i SchemaC tilbage til SchemaA. Når jeg siger "mongo" måde at gøre det på, er du nødt til at bryde væk fra dine års tænkning om relationelle dataforespørgsler. Gør hvad som helst for at udføre færre forespørgsler på databasen, selvom det kræver tovejsreferencer og/eller dataduplikering.
For eksempel, hvis jeg havde et bogskema og forfatterskema, ville jeg sandsynligvis gemme forfatternes for- og efternavn i bogsamlingen sammen med en _id-reference til den fulde profil i forfattersamlingen. På den måde kan jeg indlæse mine bøger i en enkelt forespørgsel, stadig vise forfatterens navn og derefter generere et hyperlink til forfatterens profil:/author/{_id}
. Dette er kendt som "data-denormalisering", og det har været kendt for at give folk halsbrand. Jeg forsøger at bruge det på data, der ikke ændrer sig ret ofte - som folks navne. I den anledning, at et navn ændres, er det trivielt at skrive en funktion til at opdatere alle navnene flere steder.