Twoje wyzwanie wynika z faktu, że Prop_Info
muszą być pobierane przez oba zapytania. Utrudnia to ustalenie, w której kolekcji Mongo powinien się znajdować.
W MongoDB tworzysz schemat dokumentu z idealnym celem, aby pojedynczy dokument zawierał wszystkie informacje potrzebne do wzorców zapytań. W przypadku, gdy potrzebujesz mieć te same dane D
(np. Prop_Info
w Twoim przypadku) zwrócone przez dwa oddzielne zapytania dotyczące dwóch oddzielnych kolekcji A
i B
, musisz wybrać jedną z trzech strategii:
-
Zduplikuj
D
w dokumentach obuA
iB
i wymusić spójność z kodem. Jest to zazwyczaj wybór projektowy systemów o wysokiej wydajności, które chcą wyeliminować potrzebę drugiego zapytania, nawet jeśli odbywa się to kosztem dodatkowej złożoności kodu po stronie wstawiania/aktualizacji i z pewnymi potencjalnymi problemami ze spójnością, ponieważ Mongo nie jest ACID. -
Umieść
D
wA
i zapisz referencję (DBRef lub inną kombinację pól identyfikujących) wB
aby można było się do niego dostać za pomocą drugiego zapytania. Jest to zazwyczaj wybór projektu, gdy liczba zapytań doA
przekracza liczbę zapytań doB
. ZachowujeD
lokalne do częściej wyszukiwanej kolekcji. W tym wzorcu projektu schematu wystarczy wykonać drugie zapytanie podczas zapytaniaB
. -
Umieść
D
w nowej kolekcjiC
i wykonaj do niego drugie zapytanie z obuA
iB
. Jest to zazwyczaj wybór projektu w obliczu bardzo niepewnych przyszłych wymagań, w których nie jest jasne, jakie byłyby kompromisy, jeśli zdecydujesz się na (1) lub (2) powyżej. Jest to najbardziej „relacyjny” schemat i ten, który zmusi Cię do wykonania drugiego zapytania, gdy zapytasz zarównoA
iB
.
Wybrana strategia zależy od Twojej domeny, wzorców zapytań, wsparcia, jakie otrzymujesz ze struktury mapowania obiektowo-relacyjnego (ORM) (jeśli go używasz), a także od Twoich preferencji.
W sytuacjach, z którymi się spotkałem, nigdy nie wybrałem (3). Używałem (1) w sytuacjach o wysokiej wydajności (systemy analityczne). Użyłem (2) wszędzie indziej, ponieważ wzorce dostępu do zapytań sprawiły, że stało się oczywiste, gdzie powinny znajdować się „udostępnione” dane.
Po wybraniu strategii, jeśli nadal potrzebujesz pomocy, opublikuj kolejne pytanie SO, które koncentruje się na problemie projektowania schematu przy wybranej strategii.
Trzy końcowe wskazówki:
-
Jeśli udostępnione dane
D
ma wielokrotność relacji większą niż 1 użyj tablicy. Możesz indeksować całe tablice i precyzyjnie wykonywać zapytania wewnątrz tablic, używając$elemMatch
. -
Aby zaktualizować
D
w strategii (1) lub (2) użyj modyfikatora atomowego MongoDB operacje , z których wiele jest zaprojektowanych do działania na tablicach. -
To pytanie SO obejmuje wzorzec zapytania DBRef dwa w odpowiedzi @Stennie. (@Stennie pracuje dla 10gen, markerów MongoDB.)
Powodzenia!