Mam dwie ogromne (kilkaset tysięcy rekordów) kolekcje Col1 i Col2 i muszę pobrać połączone dane z obu. Istnieje kryterium łączenia, które pozwala mi drastycznie zmniejszyć liczbę zwracanych rekordów do kilkuset, więc w języku SQL uruchomiłbym coś takiego

 SELECT ... FROM Col1 INNER JOIN Col2 ON Col1.field1 = Col2.field2

I działałby dość szybko, ponieważ Col1.field1 i Col2.field2 są polami indeksowanymi. Czy istnieje bezpośredni sposób lub obejście, aby zrobić to samo szybko w MongoDb z użyciem indeksów, a nie skanować wszystkich elementów?

Uwaga: nie mogę przeprojektować kolekcji, aby połączyć je w jedną.

4
YMC 24 wrzesień 2012, 04:00
Mamy podobną sytuację. Czy znalazłeś sposób na poprawę wydajności łączenia między 2 kolekcjami, które mają zindeksowany klucz obcy?
 – 
Ka Tech
13 wrzesień 2021, 13:05

3 odpowiedzi

Najlepsza odpowiedź

MongoDB nie ma JOIN, więc nie ma szybkiego odpowiednika. Najprawdopodobniej jest to problem z projektem schematu, ale powiedziałeś, że nie możesz tego zmienić. W jednym zapytaniu nie można wykonywać zapytań dotyczących wielu kolekcji.

Możesz wykonać dołączenie po stronie klienta w 2 zapytaniach lub możesz to zrobić w stylu nieaktywnym, wykonując map-reduce i generując trzecią kolekcję.

Zapoznaj się z to innym pytaniem, aby dowiedzieć się, jak zrobić mapę-zredukować

4
Community 23 maj 2017, 15:05
Oba sposoby, o których wspomniałeś, przypuśćmy, że przeszłam przez wszystkie pół miliona rekordów przynajmniej jednej kolekcji, która jest zabójcza wydajności, i muszę to zrobić w czasie wykonywania, a nie gdzieś w tle. Nie wydaje mi się, że jest to kwestia projektu schematu, raczej kwestia wybranego typu bazy danych, MongoDb wydaje się nie pasować do naszych wymagań aplikacyjnych
 – 
YMC
24 wrzesień 2012, 08:36
To miałem na myśli. Jest to problem z projektem schematu dla wybranej bazy danych. Najlepiej byłoby, gdybyś przechowywał to w jednej kolekcji. To nie jest wydajna sytuacja dla tego DB
 – 
jdi
24 wrzesień 2012, 08:48
Chodzi o to, że przechowywanie tych informacji w jednej kolekcji może setki razy zwiększyć rozmiar bazy danych, ponieważ istnieją setki sposobów łączenia tych 2 kolekcji, trzymanie ich oddzielnie oznacza denormalizację danych, a ich łączenie oznacza nadmierny rozmiar bazy danych i wiele powtarzających się danych. Nawet gdybym mógł przeprojektować schemat, nie zrobiłbym tego. Więc mój wniosek jest taki, że MongoDb nie jest wystarczająco elastyczny, jak relacyjne bazy danych. W każdym razie dzięki za odpowiedź
 – 
YMC
24 wrzesień 2012, 21:03
Dlaczego, u licha, miałbyś uruchamiać w czasie rzeczywistym wybór pół miliona wierszy? Jaki użytkownik byłby w stanie wyświetlić wszystkie te dane? Myślę, że musisz przemyśleć to, co robisz.
 – 
Snowburnt
5 listopad 2013, 03:07

Aby dołączyć w MongoDb 4.2, możesz użyć agregacji i $lookup w następujący sposób:

db.collection.aggregate([
   { $lookup: { from: "...", ... } }
])

To jest dla mnie przydatne

Więcej informacji: https://docs.mongodb.com/manual/reference/ operator/agregacja/wyszukiwanie/

3
Yadi 3 maj 2020, 12:56

join w MongoDB jest bardzo drogi. 2 rozwiązania:

  • Redesign połącz je w jedno
  • limit, match zanim dołączysz
0
Xuân Cường Hồ 30 grudzień 2021, 05:31