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ą.
3 odpowiedzi
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ć
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/
join
w MongoDB jest bardzo drogi. 2 rozwiązania:
- Redesign połącz je w jedno
limit
,match
zanim dołączysz
Podobne pytania
Nowe pytania
mongodb
MongoDB to skalowalna, wysokowydajna, zorientowana na dokumenty baza danych NoSQL typu open source. Obsługuje wiele języków i platform do tworzenia aplikacji. Pytania dotyczące administrowania serwerem można zadawać na stronie https://dba.stackexchange.com.