Du kan undvika N+1
-problem med hundratals förfrågningar som använder $in
-frågor. Tänk på detta:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Nu kan du hitta inläggens kommentarer med en $in
fråga, och du kan också enkelt hitta alla kommentarer som gjorts av en specifik författare.
Naturligtvis kan du också lagra kommentarerna som en inbäddad array i inlägget och utföra en $in
fråga om användarinformationen när du hämtar kommentarerna. På så sätt behöver du inte avnormalisera användarnamn och behöver fortfarande inte hundratals frågor.
Om du väljer att avnormalisera användarnamnen måste du uppdatera alla kommentarer som någonsin gjorts av den användaren när en användare ändrar t.ex. hans namn. Å andra sidan, om sådana operationer inte förekommer särskilt ofta, borde det inte vara en stor sak. Eller kanske är det ännu bättre att lagra namnet som användaren hade när han skrev kommentaren, beroende på dina krav.
Ett allmänt problem med inbäddning är att olika skribenter kommer att skriva till samma objekt
, så du måste använda atomic modifiers
(som $push
). Detta är ibland svårare att använda med kartläggare (jag kan dock inte mongoalkemi), och generellt mindre flexibelt.