sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose:Hur befolkar man en djup befolkning på två nivåer utan att befolka fält på första nivån? i mongodb

Som en ivrig mongodb-fan föreslår jag att du använder en relationsdatabas för mycket relationsdata – det är vad den är byggd för. Du förlorar alla fördelar med mongodb när du måste utföra 3+ frågor för att få ett enda objekt.

Buuuuuut , jag vet att den kommentaren kommer att falla för döva öron. Det bästa är att vara så medveten som möjligt om prestanda. Ditt första steg är att begränsa fälten till det minimum som krävs. Detta är bara god praxis även med grundläggande frågor och vilket som helst databasmotor - skaffa bara de fält du behöver (t.ex. SELECT * FROM ===dåligt... sluta bara göra det!). Du kan också försöka göra slanka frågor för att spara mycket efterbearbetningsarbete som mongoose gör med datan. Jag testade inte detta, men det borde fungera...

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.
});

Ett väldigt "mongo" sätt att göra vad du vill är också att spara en referens i SchemaC tillbaka till SchemaA. När jag säger "mongo" sätt att göra det, måste du bryta dig från dina år av tänkande om relationsdatafrågor. Gör vad som krävs för att utföra färre frågor i databasen, även om det kräver tvåvägsreferenser och/eller dataduplicering.

Om jag till exempel hade ett bokschema och ett författareschema, skulle jag sannolikt spara författarnas för- och efternamn i boksamlingen, tillsammans med en _id-referens till hela profilen i författaresamlingen. På så sätt kan jag ladda mina böcker i en enda fråga, fortfarande visa författarens namn och sedan generera en hyperlänk till författarens profil:/author/{_id} . Detta är känt som "datadenormalisering", och det har varit känt att ge människor halsbränna. Jag försöker använda det på data som inte ändras särskilt ofta - som folks namn. I de fall ett namn ändras är det trivialt att skriva en funktion för att uppdatera alla namn på flera ställen.



  1. Hur ställer jag in en primärnyckel i MongoDB?

  2. MongoDB Spark Connector py4j.protocol.Py4JJavaError:Ett fel uppstod när o50.load anropades

  3. Multi-tenant mongodb databas baserad med vårdata

  4. mongoose befolka fält utan ref alternativ