Indlejring: Relationer fra én til få
Indlejr underdokumenter til tæt koblede data, og mål fordelene ved at placere relaterede oplysninger sammen for læseydelsen.
Indlejring: Relationer fra én til få er en gratis MongoDB Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i MongoDB Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. MongoDB Academy-kurset indeholder 4 lektioner i alt.
Hvad er dokumentindlejring?
Indlejring betyder, at relaterede data gemmes direkte i et overordnet dokument i stedet for i en separat samling. I stedet for at forbinde to samlinger med en fremmednøgle indlejrer du de relaterede data som et underdokument eller en array med underdokumenter. Det er MongoDB's mest effektive designværktøj, fordi en enkelt læsning kan hente det overordnede dokument og alle dets relaterede data på én gang.
Relationen én-til-få
En én-til-få-relation findes, når ét overordnet dokument har et lille, afgrænset antal underordnede elementer — typisk færre end et par dusin. Klassiske eksempler er et blogindlæg og dets kommentarer, en bruger og dennes adresser eller en ordre og dens ordrelinjer. Når antallet af underordnede elementer er forudsigeligt og lille, er indlejring næsten altid det rigtige valg.
Indlejring af en brugers adresser
Forestil dig en samling af users, hvor hver bruger har én eller to leveringsadresser. I stedet for en separat samling af addresses indlejrer du dem direkte. Det betyder, at det kræver én forespørgsel at finde en bruger og dennes adresser — helt uden join-operationer.
db.users.insertOne({
name: 'Alice',
email: 'alice@example.com',
addresses: [
{ label: 'home', street: '123 Maple St', city: 'Austin', zip: '78701' },
{ label: 'work', street: '456 Oak Ave', city: 'Austin', zip: '78702' }
]
});Læsning af indlejrede data i én forespørgsel
Når data er indlejret, henter du det overordnede dokument og alle dets underordnede dokumenter med en enkelt findOne. Der er ikke behov for et $lookup eller en ekstra tur til databasen. Det gør læsninger hurtigere og applikationskoden enklere, fordi hele objektgrafen ankommer i ét svar.
// Retrieve user AND their addresses in a single read
const user = await db.collection('users').findOne(
{ email: 'alice@example.com' },
{ projection: { name: 1, addresses: 1 } }
);
console.log(user.addresses); // Array of embedded address objectsOpdatering af et indlejret underdokument
Hvis du vil opdatere et indlejret underdokument, skal du bruge den positionelle operator $ eller punktnotation. Hvis du for eksempel ændrer postnummeret for Alices hjemmeadresse, målrettes det bestemte array-element, der opfylder en filterbetingelse. Indlejrede opdateringer udføres atomisk på dokumentniveau — der er ikke behov for en transaktion.
db.users.updateOne(
{ email: 'alice@example.com', 'addresses.label': 'home' },
{ $set: { 'addresses.$.zip': '78703' } }
);Fordel ved læseydelse
MongoDB gemmer dokumenter som sammenhængende BSON-blokke på disken. Når du indlejrer relaterede data, læser systemet én lagerblok i stedet for at scanne to separate samlinger. Denne placering af relaterede data samlet er den vigtigste grund til, at indlejrede dokumenter overgår referencer i arbejdsbelastninger med mange læsninger, hvor det overordnede dokument og de underordnede dokumenter næsten altid tilgås sammen.
Indlejring i Mongoose
I Mongoose definerer du skemaer for underdokumenter og indlejrer dem i det overordnede skema. Mongoose behandler indlejrede arrays som arrays af underdokumenter og giver fuld typevalidering samt livscykluskroge for hvert element. Den overordnede model gemmer hele træet atomisk.
const addressSchema = new mongoose.Schema({
label: String,
street: String,
city: String,
zip: String
});
const userSchema = new mongoose.Schema({
name: String,
email: String,
addresses: [addressSchema] // embedded array of sub-documents
});
const User = mongoose.model('User', userSchema);Hvornår indlejring er bedst
Indlejring fungerer bedst, når: (1) de underordnede data altid tilgås sammen med det overordnede dokument; (2) antallet af underordnede elementer er lille og afgrænset; (3) de underordnede elementer ikke har brug for deres egen uafhængige livscyklus (f.eks. fordi de aldrig forespørges i eller opdateres isoleret). Hvis alle tre betingelser er opfyldt, er indlejring næsten med sikkerhed det optimale valg.
Grænse for dokumentstørrelse
Alle MongoDB-dokumenter har en fast størrelsesgrænse på 16 MB. For relationer af typen én-til-få er dette sjældent et problem — en bruger med ti adresser eller en ordre med tyve ordrelinjer er langt under grænsen. Du bør dog overvåge dokumenternes vækst over tid for at sikre, at indlejring ikke bringer dokumenterne tæt på grænsen.
Indlejring sammenlignet med referencer
Brug denne hurtige sammenligning til at vælge:
- Indlejring: én forespørgsel, atomiske opdateringer, et lille og afgrænset antal underordnede elementer
- Referencer: fleksibelt antal underordnede elementer, delte underordnede elementer, uafhængige forespørgsler efter underordnede elementer
For relationer af typen én-til-få vinder indlejring på næsten alle mål. Du undgår ekstra netværksture og holder dit skema enkelt.
Praktisk eksempel: Blogindlæggets tags
Et blogindlæg har typisk et lille, fast sæt tags. I stedet for at vedligeholde en separat samling af tags med referencer kan du indlejre tags som et array af strenge direkte i indlægsdokumentet. Forespørgsler efter indlæg via tag er effektive med et flernøgleindeks på feltet tags, og når du læser et indlæg, returneres dets tags altid i det samme dokument.
db.posts.insertOne({
title: 'Getting Started with MongoDB',
body: 'MongoDB is a document database...',
tags: ['mongodb', 'nosql', 'database'],
author: 'Alice',
createdAt: new Date()
});
// Index the tags array for fast tag-based lookups
db.posts.createIndex({ tags: 1 });Hurtigt tjek
Test din forståelse af begreberne MongoDB og NoSQL-databaser fra denne lektion.
Opsummering af lektionen
I denne lektion lærte du, at indlejring placerer relaterede data i det overordnede dokument, at relationer af typen én-til-få drager fordel af indlejring, fordi en enkelt læsning henter alle data, og at Mongoose understøtter skemaer for underdokumenter i typesikre indlejrede arrays. Næste gang undersøger vi referencer — hvornår du skal forbinde dokumenter på tværs af samlinger i stedet for at indlejre dem.
Lær JavaScript med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Indlejring: Relationer fra én til få” gratis?
Ja — hele teksten til “Indlejring: Relationer fra én til få” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af MongoDB Academy-kurset, skal du opgradere til CoddyKit PRO. MongoDB Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Indlejring: Relationer fra én til få”?
Indlejr underdokumenter til tæt koblede data, og mål fordelene ved at placere relaterede oplysninger sammen for læseydelsen. Du øver dig i MongoDB Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på MongoDB Academy?
Der kræves ingen tidligere erfaring. MongoDB Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Indlejring: Relationer fra én til få”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne MongoDB Academy-lektion?
Ja. Alle MongoDB Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Indlejring: Relationer fra én til få
- Referencer: Relationer fra én til mange og mange til mange
- Anti-mønsteret med ubegrænsede arrays
- Beslutningsramme for schemadesign