MongoDB is over het algemeen niet geschikt voor het modelleren van grafiekrelaties. Er zijn gespecialiseerde grafische databases die uitblinken in deze taak.
Als u echter geen andere databasetechnologie aan de mix wilt toevoegen, raad ik u aan een nieuwe verzameling frienships
te maken en modelleer elke vriendenrelatie als een document met een array van twee items, elk een object met de verkorte informatie over een van de gebruikers die je nodig hebt om een item in je vriendenlijsten weer te geven:
{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
De reden voor het dupliceren van informatie uit de gebruikersdocumenten in de vriendschapsdocumenten is om een tweede zoekopdracht naar de gebruikersverzameling te vermijden om alle gegevens te verkrijgen voor het weergeven van een gebruikersvriendenlijst. MongoDB kan geen JOINs doen kan alleen JOIN's uitvoeren op verzamelingen zonder shard
, dus u moet voorkomen dat gegevens die u nodig hebt voor een specifieke use-case over meerdere collecties worden verspreid, zelfs als dit betekent dat u overtolligheden creëert. Anders zou u meerdere zoekopdrachten achter elkaar moeten uitvoeren, wat de reactietijd van uw aanvraag aanzienlijk vertraagt.
Als je de vriendenlijst van gebruiker 123 wilt krijgen, voer je een db.friendships.find({"friendship.id", 123})
uit (een index op friendship.id
prestaties verbeteren) en ontvang vervolgens een lijst met documenten waarin Bob de eerste of de tweede vriend is.
U zou dan deze documenten herhalen en de korte informatie van de array-invoer uitvoeren die niet is gebruiker 123.
Als alternatief kunt u de Bob-vermeldingen in de database filteren met een aggregatiepijplijn. Gebruik de $match-query hierboven, $ontspan de vriendschaps-array en $match vervolgens die documenten waarbij id niet 123 is. Dit zou een compromis zijn:u bespaart bandbreedte ten koste van de CPU-belasting op de databaseserver.
Om te vragen of er al een vriendschapsrelatie bestaat, gebruik je:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();