MongoDB generalnie nie nadaje się do modelowania relacji grafowych. Istnieją wyspecjalizowane bazy danych wykresów, które doskonale sprawdzają się w tym zadaniu.
Jeśli jednak nie chcesz dodawać do miksu kolejnej technologii bazodanowej, polecam utworzyć nową kolekcję frienships
i zamodeluj każdą relację przyjaciela jako dokument z tablicą dwóch wpisów, z których każdy jest obiektem ze skróconą informacją o jednym z użytkowników, której potrzebujesz, aby wyświetlić wpis na swojej liście znajomych:
{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
Powodem duplikowania informacji z dokumentów użytkownika w dokumentach przyjaźni jest uniknięcie drugiego zapytania do kolekcji użytkowników w celu uzyskania wszystkich danych do wyświetlenia listy znajomych użytkowników. MongoDB nie może wykonywać JOIN może wykonywać tylko JOIN w kolekcjach nieshardowanych
, więc należy unikać rozdzielania danych potrzebnych do konkretnego przypadku użycia w wielu kolekcjach, nawet jeśli oznacza to utworzenie nadmiarowości. W przeciwnym razie konieczne byłoby wykonanie wielu zapytań jedno po drugim, co znacznie spowalnia czas odpowiedzi aplikacji.
Jeśli chcesz uzyskać listę znajomych użytkownika 123, wykonaj db.friendships.find({"friendship.id", 123})
(indeks na friendship.id
poprawi wydajność), a następnie otrzyma listę dokumentów, w których Bob jest pierwszym lub drugim przyjacielem.
Następnie możesz iterować te dokumenty i wyprowadzać krótkie informacje o wpisie tablicy, który nie użytkownik 123.
Alternatywnie możesz odfiltrować wpisy Bob w bazie danych za pomocą potoku agregacji. Użyj powyższego zapytania $match, $rozwiń tablicę przyjaźni, a następnie $match te dokumenty, w których id nie jest równe 123. Byłby to kompromis:oszczędzasz przepustowość kosztem obciążenia procesora na serwerze bazy danych.
Aby zapytać, czy związek przyjaźni już istnieje, użyj:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();