user może mieć wiele projects (a projekt jest powiązany tylko z jednym użytkownikiem). To jest jeden do wielu związek.
Każdy user powinien przechowywać listę swoich projects . Na przykład:
user:
id: <some value>,
name: <some value>,
email: <some value>,
projects: [
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
...
]
Zwróć uwagę, że każdy project jest dokumentem podrzędnym (obiektem lub osadzonym dokumentem) w ramach projects szyk. project ma powiązane szczegóły, takie jak projectId , projectName itp.
Myślę, że powinna być tylko jedna kolekcja nazywana jako user_projects . Zakładając, że:(i) user może mieć od 0 do 100 projektów i (ii) project szczegóły nie są zbyt duże.
Jest to model osadzania strony „wielu” relacji 1 do N w stronę „jednego”. To zalecany sposób, denormalizujący dane. Ma to zaletę wydajnych i szybkich zapytań. Upraszcza to transakcje, ponieważ zapisy (wstawienia, aktualizacje i usunięcia) będą niepodzielne przy pojedynczej operacji na dokumencie w tej samej kolekcji.
Będziesz używać user id lub name (z unikalnym indeksem), aby pobrać dokument i będzie to bardzo szybkie zapytanie. Możesz mieć indeks w projects tablica (indeksy w polach tablicy są nazywane indeksami wielokluczowymi ) - na polach projektu. Na przykład indeks na projectId lub/i projectName ma sens.
Możesz pobrać wszystkie projekty dla użytkownika - to proste zapytanie za pomocą user id / name . Zapytanie projekcja zezwala na jakie informacje związane z project jest wyświetlany. Możesz użyć find lub aggregate metoda budowania zapytania.Możesz zapytać o konkretny project dla user , używając projectId lub projectName . Ponieważ istnieją indeksy dla user i project pola, będzie to skuteczne zapytanie.
Tak więc radzę mieć jedną kolekcję, user_projects , z user informacje i projects informacje w nim zawarte.