NoSQL - Połączenie danych z wielu kolekcji

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

{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

{"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?

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

0
 
 {$match:{dept : {$regex: /^STRZELECKA/}}},
 

screenshot-20190318133910.png

0

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

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) ;)

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

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?

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.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1