MongoDB i "łączy" [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak wykonać odpowiednik SQL Join w MongoDB? (19 odpowiedzi) Zamknięty 4 lata temu .

Jestem pewien, że MongoDB oficjalnie nie wspiera "joins". Co to znaczy?

Czy to znaczy "nie możemy połączyć dwóch zbiorów (tabel) razem."?

Myślę, że jeśli umieścimy wartość _id w zbiorze A na other_id w zbiorze B, Czy możemy po prostu połączyć dwa zbiory?

Jeśli dobrze rozumiem, MongoDB może połączyć ze sobą dwie tabele, powiedzmy, gdy uruchamiamy zapytanie. Odbywa się to poprzez " odniesienie" napisane w http://www.mongodb.org/display/DOCS/Schema + Design .

Więc co tak naprawdę oznacza "łączenie"?

Chciałbym znać odpowiedź, ponieważ jest to niezbędne do nauki projektowania schematów MongoDB. http://www.mongodb.org/display/DOCS/Schema + Design

 164
Author: TK., 2010-11-01

7 answers

To nie join, ponieważ związek będzie oceniany tylko wtedy, gdy będzie to konieczne. Join (w bazie danych SQL) z drugiej strony rozwiązuje relacje i zwraca je tak, jakby były pojedynczą tabelą ("połącz dwie tabele w jedną").

Możesz przeczytać więcej o DBRef tutaj: http://docs.mongodb.org/manual/applications/database-references/

Istnieją dwa możliwe rozwiązania do rozwiązywania odniesień. Jednym z nich jest zrobienie tego ręcznie, jak już prawie opisałeś. Just save a _id dokumentu w other_id innego dokumentu, a następnie napisz własną funkcję, aby rozwiązać tę relację. Innym rozwiązaniem jest użycie DBRefs, jak opisano na stronie podręcznika, co sprawi, że MongoDB rozwiąże relację po stronie Klienta na żądanie. To, które rozwiązanie wybierzesz, nie ma większego znaczenia, ponieważ obie metody rozwiążą relację po stronie klienta(zauważ, że baza danych SQL rozwiązuje połączenia po stronie serwera).

 101
Author: Emil Vikström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 20:04:53

Baza danych nie łączy -- lub automatyczne "łączenie" między dokumentami. Jednak możesz to zrobić samodzielnie po stronie klienta. Jeśli trzeba zrobić 2, to jest w porządku, ale jeśli trzeba zrobić 2000, Liczba turnarounds klient / serwer sprawi, że operacja spowolni.

W MongoDB wspólnym wzorcem jest osadzanie. W relacyjnych, gdy normalizacja rzeczy ulegają podziałowi na części. Często w mongo te kawałki kończą się jako jeden dokument, więc nie jest potrzebne połączenie i tak. Ale kiedy ktoś jest potrzebny, robi it po stronie klienta.

Rozważmy klasyczny porządek, przykład ORDER-LINEITEM. Jeden rozkaz i 8 pozycji liniowych to 9 wierszy w relacjach; w MongoDB zazwyczaj modelujemy to jako pojedynczy dokument BSON, który jest porządkiem z tablicą osadzonych pozycji liniowych. W takim przypadku problem z połączeniem nie pojawia się. Jednak zamówienie będzie miało klienta, który prawdopodobnie jest oddzielnym zbiorem-klient może odczytać cust_id z dokumentu zamówienia, a następnie pobrać go w razie potrzeby osobno.

Jest kilka filmów i slajdów do rozmów na temat projektowania schematów mongodb.org strona internetowa, w którą wierzę.

 31
Author: dm.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 21:47:38

Jednym z rodzajów dołączania do zapytania w mongoDB jest zapytanie w jednej kolekcji o id , które pasują, umieszczanie ID na liście (idlist) i znajdowanie w innej (lub tej samej) kolekcji za pomocą $in : idlist

u = db.friends.find({"friends": something }).toArray()
idlist= []
u.forEach(function(myDoc) { idlist.push(myDoc.id ); } )
db.family.find({"id": {$in : idlist} } )
 12
Author: Sérgio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 07:47:23

Pierwszy przykład, do którego linkujesz, pokazuje, jak referencje MongoDB zachowują się podobnie jak leniwe Ładowanie, a nie jak join. Nie ma tam zapytania, które dzieje się w obu kolekcjach, raczej odpytywasz jedną, a następnie przeszukiwasz elementy z innej kolekcji przez odniesienie.

 6
Author: Ian Mercer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 07:27:01

Fakt, że mongoDB nie jest relacyjny skłonił niektórych ludzi do uznania go za bezużyteczny . Myślę, że powinieneś wiedzieć, co robisz przed zaprojektowaniem DB. Jeśli zdecydujesz się użyć noSQL DB, takiego jak MongoDB, lepiej zaimplementuj schemat. Dzięki temu twoje zbiory - mniej lub bardziej-będą przypominały tabele w bazach danych SQL. Należy również unikać denormalizacji (osadzania), chyba że jest to konieczne ze względu na wydajność.

Jeśli chcesz zaprojektować własną bazę danych noSQL, proponuję mieć sprawdź dokumentację Firebase {[2] }. Jeśli rozumiesz, w jaki sposób organizują dane dla swojej usługi, możesz łatwo zaprojektować podobny wzór dla swojego.

Jak zauważyli inni, będziesz musiał wykonać dołączanie po stronie klienta, z wyjątkiem Meteor (framework Javascript), możesz zrobić dołączanie po stronie serwera za pomocą tego pakietu (nie znam innego frameworku, który Ci na to pozwala). Jednak proponuję przeczytać ten Artykuł przed podjęciem decyzji o tym wybór.

Edit 28.04.17: Niedawno Firebase opublikował ten znakomity cykl o projektowaniu baz danych noSql. Podkreślili również w jednym z odcinków powody, dla których należy unikać dołączania i jak obejść takie scenariusze, denormalizując swoją bazę danych.

 6
Author: Salah Saleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 21:34:29

Jeśli używasz mangusty, możesz po prostu użyć (zakładając, że używasz subdokumentów i populacji):

Profile.findById profileId
  .select 'friends'
  .exec (err, profile) ->
    if err or not profile
      handleError err, profile, res
    else
      Status.find { profile: { $in: profile.friends } }, (err, statuses) ->
        if err
          handleErr err, statuses, res
        else
          res.json createJSON statuses

Pobiera Statuses które należą do jednego z Profile (profileId) przyjaciele. Friends to zbiór odniesień do innych Profiles. Profile schemat z friends zdefiniowany:

schema = new mongoose.Schema
  # ...

  friends: [
    type: mongoose.Schema.Types.ObjectId
    ref: 'Profile'
    unique: true
    index: true
  ]
 1
Author: Daniel Kmak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 20:47:18

Natknąłem się na wiele postów szukających tego samego - "MongoDB" i alternatyw lub odpowiedników. Więc moja odpowiedź pomoże wielu innym, którzy są tacy jak ja. To jest odpowiedź, której bym szukał.

Używam Mongoose z Express framework. Istnieje funkcjonalność o nazwie Population w miejsce złączeń.

Jak wspomniano w Mangusta docs .

W MongoDB nie ma łączników, ale czasami potrzebujemy odniesień do dokumentów w innych kolekcjach. To jest tam, gdzie pojawia się populacja.

Ta odpowiedź StackOverflow pokazuje prosty przykład, jak z niej korzystać.

 0
Author: mythicalcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:36