MongoDB er generelt ikke en god egnet til modellering af grafrelationer. Der er specialiserede grafdatabaser, som udmærker sig til denne opgave.
Men når du ikke ønsker at tilføje en anden databaseteknologi til blandingen, vil jeg anbefale at oprette en ny samling venskaber
og modeller hver ven-relation som et dokument med en række af to poster, hver af dem et objekt med den forkortede information om en af brugerne, som du skal bruge for at vise en post i dine vennelister:
{ venskab:[ { id:123, navn:"Bob", avatar:"Bob.jpg" }, { id:456, navn:"Alice", avatar:"Alice.jpg" } ] }
Årsagen til at duplikere information fra brugerdokumenterne i venskabsdokumenterne er at undgå en anden forespørgsel til brugernes samling for at få alle data til at vise en brugers venneliste. MongoDB kan ikke lave JOINs kan kun udføre JOINs på ikke-delte samlinger
, så du bør undgå at sprede data, du har brug for til en specifik use-case, over flere samlinger, selv når det betyder, at du opretter redundanser. Ellers ville du være nødt til at udføre flere forespørgsler efter hinanden, hvilket sænker responstiden for din ansøgning betydeligt.
Når du ønsker at hente vennelisten for bruger 123, udfører du en db.friendships.find({"friendship.id", 123})
(et indeks på friendship.id
vil forbedre ydeevnen) og derefter modtage en liste over dokumenter, hvor Bob enten er den første eller den anden ven.
Du vil derefter gentage disse dokumenter og udsende den korte information om array-indgangen, som ikke er bruger 123.
Alternativt kan du filtrere Bob-posterne fra databasen med en aggregeringspipeline. Brug $match-forespørgslen ovenfor, $vind venskabsarrayet af og $match de dokumenter, hvor id ikke er 123. Dette ville være en afvejning:Du sparer båndbredde på bekostning af CPU-belastning på databaseserveren.
For at forespørge om et venskabsforhold allerede eksisterer, brug:
db.friendships.find( { $and:[ { "friendship.id":123 }, { "friendship.id":456 } ]} ).count();