MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak modelowałbyś relację przyjaźni w MongoDB?

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();



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak utworzyć indeks tekstowy w MongoDB

  2. Kolejność $lt i $gt w zapytaniu zakresu MongoDB

  3. Metoda findOne Mongoose pobiera prawidłowy dokument z brakującym identyfikatorem _id

  4. Jak znaleźć podobne dokumenty w MongoDB?

  5. Mongoose VersionError:Nie znaleziono pasującego dokumentu dla identyfikatora podczas zapisywania dokumentu