NoSQL - Połączenie danych z wielu kolekcji

NoSQL - Połączenie danych z wielu kolekcji
aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Hej,
Takie zadanie:
**Znajdź pracowników, którzy pracują przy ul. Strzeleckiej. Oprócz nazwiska podaj również nazwę zespołu, do którego pracownik należy. Uwaga! Nie używaj identyfikatora zespołu do przeprowadzenia selekcji. Nie używaj również numeru budynku.**

Mamy dwie kolekcje:
pracownicy

Kopiuj
{id_prac:100, nazwisko:"WEGLARZ", etat:'DYREKTOR', zatrudniony: new Date("1968-01-01"), placa_pod:1730.00, placa_dod:420.50, id_zesp:10}, 
{id_prac:110, nazwisko:'BLAZEWICZ', etat:"PROFESOR",id_szefa:100, zatrudniony: new Date("1973-05-01"), placa_pod:1350.00, placa_dod:210.00, id_zesp:40}, 
{id_prac:120, nazwisko:'SLOWINSKI', etat:"PROFESOR",id_szefa:100, zatrudniony: new Date("1977-09-01"), placa_pod:1070.00, id_zesp:30}, 
{id_prac:130, nazwisko:'BRZEZINSKI', etat:"PROFESOR",id_szefa:100, zatrudniony: new Date("1968-07-01"), placa_pod:960.00, id_zesp:20}, 
{id_prac:140, nazwisko:'MORZY', etat:"PROFESOR",id_szefa:130, zatrudniony: new Date("1975-09-15"), placa_pod:830.00, placa_dod:105.00, id_zesp:20}, 
{id_prac:150, nazwisko:'KROLIKOWSKI', etat:'ADIUNKT',id_szefa:130, zatrudniony: new Date("1977-09-01"), placa_pod:645.50, id_zesp:20}, 
{id_prac:160, nazwisko:'KOSZLAJDA', etat:'ADIUNKT', id_szefa:130, zatrudniony: new Date("1985-03-01"), placa_pod:590.00, id_zesp:20}, 
{id_prac:170, nazwisko:'JEZIERSKI', etat:'ASYSTENT', id_szefa:130, zatrudniony: new Date("1992-10-01"), placa_pod:439.70, placa_dod:80.50, id_zesp:20},
{id_prac:190, nazwisko:'MATYSIAK', etat:'ASYSTENT', id_szefa:140, zatrudniony: new Date("1993-09-01"), placa_pod:371.00, id_zesp:20}, 
{id_prac:180, nazwisko:'MAREK', etat:'SEKRETARKA', id_szefa:100, zatrudniony: new Date("1985-02-20"), placa_pod:410.20, id_zesp:10}, 
{id_prac:200, nazwisko:'ZAKRZEWICZ', etat:'STAZYSTA', id_szefa:140, zatrudniony: new Date("1994-07-15"), placa_pod:208.00, id_zesp:30}, 
{id_prac:210, nazwisko:'BIALY', etat:'STAZYSTA', id_szefa:130, zatrudniony: new Date("1993-10-15"), placa_pod:250.00, placa_dod:170.60, id_zesp:30}, 
{id_prac:220, nazwisko:'KONOPKA', etat:'ASYSTENT', id_szefa:110, zatrudniony: new Date("1993-10-01"), placa_pod:480.00, id_zesp:20}, 
{id_prac:230, nazwisko:'HAPKE', etat:'ASYSTENT', id_szefa:120, zatrudniony: new Date("1992-09-01"), placa_pod:480.00, placa_dod:90.00, id_zesp:30} 
])

zespoly

Kopiuj
{"id_zesp":10,"nazwa":"ADMINISTRACJA","adres":"PIOTROWO 3A"}, 
{"id_zesp":20,"nazwa":"SYSTEMY ROZPROSZONE","adres":"PIOTROWO 3A"}, 
{"id_zesp":30,"nazwa":"SYSTEMY EKSPERCKIE","adres":"STRZELECKA 14"}, 
{"id_zesp":40,"nazwa":"ALGORYTMY","adres":"WLODKOWICA 16"},
{"id_zesp":50,"nazwa":"BADANIA OPERACYJNE","adres":"MIELZYNSKIEGO 30"} 
])

Mam zapytanie, które wyświetli wymagane informacje. Ale na podstawie czego napisać match by nie uzywac ID zespolu ani adres do wybrania pracownikow ze Strzeleckiej?

Kopiuj
db.pracownicy.aggregate(
[{$lookup:{from: "zespoly", localField: "id_zesp", foreignField: "id_zesp", as: "dept"}},
{$project:{
"_id":0,
"nazwisko":"$nazwisko",
"etat":"$etat",
"zespol":{$arrayElemAt:["$dept.nazwa",0]},
"dept": {$arrayElemAt:["$dept.adres",0]}}}
])

Testowanie kodu ewentualnie tutaj: https://www.mplay.run/mongodb-online-terminal

ipsd
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: London
0
Kopiuj
 
 {$match:{dept : {$regex: /^STRZELECKA/}}},
 

screenshot-20190318133910.png

QA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Po nazwiskach wykładowców widzę, że zadania są z Politechniki Poznańskiej :)

ipsd
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: London
0
qaz napisał(a):

Po nazwiskach wykładowców widzę, że zadania są z Politechniki Poznańskiej :)

MongoDB mini przewodnik (Instytut Informatyki, Politechnika Poznańska) ;)

aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Tak. Zadanie 11.
@ipsd, chodzi o to by nie używać nazwy ulicy.
Samego matcha mniej więcej ogarnę. Ale to problem logiczny a nie kodowy.
Chyba, że nie zrozumiałem o co chodzi, i faktycznie nazwa ulicy może być użyta.

EDYTA: i dodatkowe pytanie: w zadaniu 10:
**Dla każdego pracownika zespołu nr 20 lub 30, uzyskaj nazwisko tego pracownika oraz adres jego zespołu.**
match byl miedzy lookupem a projectem

Kopiuj
db.pracownicy.aggregate(
[{$lookup:{from: "zespoly", localField: "id_zesp", foreignField: "id_zesp", as: "dept"}},
{$match:{$or:[{"id_zesp":20}, {"id_zesp":30}]}},
{$project:{
	"_id":0,
	"nazwisko":"$nazwisko",
	"dept": {$arrayElemAt:["$dept.adres",0]}}}
])

a tutaj musi być za projectem.
Od czego to zależy gdzie go umieszczamy?

ipsd
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: London
0
aPsikus napisał(a):

Tak. Zadanie 11.
@ipsd, chodzi o to by nie używać nazwy ulicy.
Samego matcha mniej więcej ogarnę. Ale to problem logiczny a nie kodowy.
Chyba, że nie zrozumiałem o co chodzi, i faktycznie nazwa ulicy może być użyta.

No to proponuje najpierw ogarnac czytanie ze zrozumieniem ;)

Zadanie 11.
Znajdź pracowników, którzy pracują przy ul. Strzeleckiej. Oprócz nazwiska podaj również nazwę zespołu, do
którego pracownik należy. Uwaga! Nie używaj identyfikatora zespołu do przeprowadzenia selekcji. Nie używaj
również numeru budynku.

aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

A co wg Ciebie jest identyfikatorem zespołu czy numerem budynku?
Ulica przeciez jest dept.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.