Many of these practice problems will refer to a “Worker Database” in which we want to capture:
-- Postgres drop database if exists workers; create database workers; \c workers; create table person (id serial primary key, name varchar not null, street varchar, city varchar); create table company (id serial primary key, name varchar not null, city varchar); create table works (person_id int not null, company_id int not null, salary decimal(16, 2), primary key(person_id, company_id), foreign key(person_id) references person(id), foreign key(company_id) references company(id)); create table manages (manager_id int not null, employee_id int not null, primary key(manager_id, employee_id), foreign key(manager_id) references person(id), foreign key(employee_id) references person(id));
insert into person (name, street, city) values ('Mari', 'Third', 'Los Angeles'), ('Karen', 'Sunset', 'West Hollywood'), ('Ellie', 'Hollywood', 'Los Angeles'), ('Gwen', 'Qianmen', 'Beijing'), ('Emily', 'Melrose', 'Los Angeles'), ('Joey', 'Beverly', 'Los Angeles'), ('Ivan', 'Rodeo', 'Los Angeles'), ('Jie', 'La Brea', 'Inglewood'), ('Hiro', 'Wilton', 'Beverly Hills'), ('Sipho', 'Sixth', 'Los Angeles'), ('Luiza', 'Xidan', 'Beijing'), ('Kameke', 'Park', 'New York'), ('Kimiko', 'Yonge', 'Toronto'), ('Olivia', 'Xidan', 'Beijing'); insert into company (name, city) values ('Criteo', 'Paris'), ('Fandango', 'Santa Monica'), ('Tsujita', 'Los Angeles'), ('Bernini', 'Beverly Hills'), ('Riot', 'Los Angeles'), ('Google', 'Mountain View'), ('Google', 'Venice'), ('IBM', 'San Jose'), ('Snapchat', 'Santa Monica'), ('Sony', 'Culver City'), ('Sony', 'Tokyo'), ('Criteo', 'São Paulo'), ('Criteo', 'Dubai'); insert into works (person_id, company_id, salary) values (1, 5, 125572.27), (1, 8, 130000), (2, 1, 93250), (3, 3, 75000), (4, 3, 25000), (5, 1, 450000), (5, 7, 200000), (8, 3, 23350), (8, 8, 85750.10), (9, 7, 115000), (10, 9, 132700), (11, 13, 310000), (13, 10, 89925), (13, 11, 118000), (14, 13, 400000); insert into manages values (3, 4), (3, 8), (5, 2), (9, 5), (1, 8), (11, 1), (11, 14);
select p.name from person p where p.city='Los Angeles';
select p.name, p.street, p.city from person p where p.city in ('Beijing', 'West Hollywood');
select p.name, p.street, p.city from person p where p.city in ('Beijing', 'West Hollywood') order by p.name;
select p.city, count(p.id) from person p group by p.city;
select p.city, count(p.id) as number_of_residents from person p group by p.city having count(p.id) > 1 order by number_of_residents desc;
select c.name, count(c.name) as number_of_locations from company c group by c.name order by c.name;
select p.name, p.city from person p join works w on p.id=w.person_id join company c on c.id=w.company_id where c.name='Tsujita';
select p.name, p.street || ', ' || p.city as address, w.salary from person p join works w on p.id=w.person_id join company c on c.id=w.company_id where c.name='Tsujita' and w.salary < 50000;
select p.name as employee_name, p.city, c.name as company_name from person p join works w on p.id=w.person_id join company c on c.id=w.company_id where p.city=c.city;
select e.name as employee, m.name as manager, e.street, e.city from person e join manages r on e.id=r.employee_id join person m on m.id=r.manager_id where e.street=m.street and e.city=m.city;
select p.name from person p where p.id not in ( select person_id from works );
select p.name from person p where p.id not in ( select p.id from person p join works w on p.id=w.person_id join company c on c.id=w.company_id where c.name = 'Tsujita' );
select p.name, w.salary from person p join works w on p.id=w.person_id where w.salary > ( select max(w.salary) from works w join company c on w.company_id=c.id and c.name='IBM' );
select p.name, coalesce(sum(w.salary), 0) as total_salary from person p left join works w on p.id=w.person_id group by p.name order by total_salary desc;
select c.name, c.city, count(p.id) from company c left join works w on c.id=w.company_id left join person p on p.id=w.person_id group by c.name, c.city order by c.name, c.city;
select distinct c.name from company c where not exists ( (select city from company where name='Riot') except (select c1.city from company c1 where c.name=c1.name));
select p.name, count(*) as direct_reports from person p join manages m on p.id=m.manager_id group by p.name;
select e.name as employee, m.name as middle, b.name as boss from person e join manages m1 on e.id=m1.employee_id join person m on m1.manager_id=m.id join manages m2 on m.id=m2.employee_id join person b on m2.manager_id=b.id;
select p.city, avg(w.salary) from person p join works w on p.id=w.person_id group by p.city
select c.name, c.city, count(*) from company c join works w on c.id=w.company_id group by c.name, c.city order by 3 desc limit 1;
select c.name, count(*) from company c join works w on c.id=w.company_id group by c.name order by 2 desc limit 1;
select c.name, sum(w.salary) as payroll, min(w.salary), max(w.salary), round(avg(w.salary)::decimal, 2) as avg, count(*) as num_workers from company c join works w on c.id=w.company_id group by c.name;
select c.name, round(avg(w.salary)::decimal, 2) as avg from company c join works w on c.id=w.company_id group by c.name having avg(w.salary) > ( select avg(w.salary) from works w where w.company_id in ( select id from company where name='Snapchat' ) );
create (mari: Person {name: 'Mari', street: 'Third', city: 'Los Angeles'}), (karen: Person {name: 'Karen', street: 'Sunset', city: 'West Hollywood'}), (ellie: Person {name: 'Ellie', street: 'Hollywood', city: 'Los Angeles'}), (gwen: Person {name: 'Gwen', street: 'Qianmen', city: 'Beijing'}), (emily: Person {name: 'Emily', street: 'Melrose', city: 'Los Angeles'}), (joey: Person {name: 'Joey', street: 'Beverly', city: 'Los Angeles'}), (ivan: Person {name: 'Ivan', street: 'Rodeo', city: 'Los Angeles'}), (jie: Person {name: 'Jie', street: 'La Brea', city: 'Inglewood'}), (hiro: Person {name: 'Hiro', street: 'Wilton', city: 'Beverly Hills'}), (sipho: Person {name: 'Sipho', street: 'Sixth', city: 'Los Angeles'}), (luiza: Person {name: 'Luiza', street: 'Xidan', city: 'Beijing'}), (kameke: Person {name: 'Kameke', street: 'Park', city: 'New York'}), (kimiko: Person {name: 'Kimiko', street: 'Yonge', city: 'Toronto'}), (olivia: Person {name: 'Olivia', street: 'Xidan', city: 'Beijing'}), (criteo_p: Company {name: 'Criteo', city: 'Paris'}), (fandango_s: Company {name: 'Fandango', city: 'Santa Monica'}), (tsujita_l: Company {name: 'Tsujita', city: 'Los Angeles'}), (bernini_b: Company {name: 'Bernini', city: 'Beverly Hills'}), (riot_l: Company {name: 'Riot', city: 'Los Angeles'}), (google_m: Company {name: 'Google', city: 'Mountain View'}), (google_v: Company {name: 'Google', city: 'Venice'}), (ibm_s: Company {name: 'IBM', city: 'San Jose'}), (snapchat_s: Company {name: 'Snapchat', city: 'Santa Monica'}), (sony_c: Company {name: 'Sony', city: 'Culver City'}), (sony_t: Company {name: 'Sony', city: 'Tokyo'}), (criteo_s: Company {name: 'Criteo', city: 'São Paulo'}), (criteo_d: Company {name: 'Criteo', city: 'Dubai'}), (mari)-[:WORKS {salary: 125572.27}]->(riot_l), (mari)-[:WORKS {salary: 130000.00}]->(ibm_s), (karen)-[:WORKS {salary: 93250.00}]->(criteo_p), (ellie)-[:WORKS {salary: 75000.00}]->(tsujita_l), (gwen)-[:WORKS {salary: 25000.00}]->(tsujita_l), (emily)-[:WORKS {salary: 450000.00}]->(criteo_p), (emily)-[:WORKS {salary: 200000.00}]->(google_v), (jie)-[:WORKS {salary: 23350.00}]->(tsujita_l), (jie)-[:WORKS {salary: 85750.10}]->(ibm_s), (hiro)-[:WORKS {salary: 115000.00}]->(google_v), (sipho)-[:WORKS {salary: 132700.00}]->(snapchat_s), (luiza)-[:WORKS {salary: 310000.00}]->(criteo_d), (kimiko)-[:WORKS {salary: 89925.00}]->(sony_c), (kimiko)-[:WORKS {salary: 118000.00}]->(sony_t), (olivia)-[:WORKS {salary: 400000.00}]->(criteo_d), (ellie)-[:MANAGES]->(gwen), (ellie)-[:MANAGES]->(jie), (emily)-[:MANAGES]->(karen), (hiro)-[:MANAGES]->(emily), (mari)-[:MANAGES]->(jie), (luiza)-[:MANAGES]->(mari), (luiza)-[:MANAGES]->(olivia);
match (p:Person {city: 'Los Angeles'}) return p.name;
match (p:Person) where p.city in ['Beijing', 'West Hollywood'] return p.name;
match (p:Person) where p.city in ['Beijing', 'West Hollywood'] return p.name order by p.name;
match (p:Person) return p.city, count(*)
match (p:Person) with p.city as city, count(*) as number_of_residents where number_of_residents > 1 return city, number_of_residents order by number_of_residents desc
match (c:Company) return c.name, count(c.city) order by c.name
match (p:Person)-[:WORKS]->(:Company {name: 'Tsujita'}) return p.name, p.city
match (p:Person)-[w: WORKS]->(:Company {name: 'Tsujita'}) where w.salary < 50000 return p.name, (p.street + ", " + p.city) as address, w.salary
match (p:Person)-[:WORKS]->(c:Company) where p.city = c.city return p.name, p.city, c.name
match (e:Person)<-[:MANAGES]-(m:Person) where e.city = m.city AND e.street = m.street return e, m
match (p:Person) where not exists((p)-[:WORKS]->(:Company)) return p
match (p:Person) where not exists((p)-[:WORKS]->(:Company {name: 'Tsujita'})) return p
match (p:Person)-[r:MANAGES]->(s:Person) return p.name, count(s)
match (p:Person)-[r:MANAGES*]->(s:Person) return p.name, count(s)
match (boss:Person)-[:MANAGES]->(middle:Person)-[:MANAGES]->(employee:Person) return boss.name as boss, middle.name as middle, employee.name as employee
match (p:Person)-[w:WORKS]->(c:Company) return p.city, avg(w.salary)
match (p:Person)-[:WORKS]->(c:Company) return c.name, c.city, count(p) as num_employees order by num_employees desc limit 1
match (p:Person)-[:WORKS]->(c:Company) return c.name, count(p) as num_employees order by num_employees desc limit 1
match (p:Person)-[w:WORKS]->(c:Company) return c.name, sum(w.salary) as payroll, min(w.salary), max(w.salary), avg(w.salary) as avg, count(*) as num_workers order by num_employees desc limit 1
{ "_id" : ObjectId("59064fa0a3e67042eadf759a"), "name" : "Mari", "street" : "Third", "city" : "Los Angeles", "manages" : [ ObjectId("59064fa0a3e67042eadf75a1") ], "companies" : [ { "name" : "Riot", "city" : "Los Angeles", "salary" : 125572.27 }, { "name" : "IBM", "city" : "San Jose", "salary" : 130000 } ] }Write a JavaScript or Python script to create a Mongo database, and a collection of workers, according to this scheme. Use the same content as in your previous (relation and graph) answers.
db.people.insert({name: 'Mari', street: 'Third', city: 'Los Angeles'}); db.people.insert({name: 'Karen', street: 'Sunset', city: 'West Hollywood'}); db.people.insert({name: 'Ellie', street: 'Hollywood', city: 'Los Angeles'}); db.people.insert({name: 'Gwen', street: 'Qianmen', city: 'Beijing'}); db.people.insert({name: 'Emily', street: 'Melrose', city: 'Los Angeles'}); db.people.insert({name: 'Joey', street: 'Beverly', city: 'Los Angeles'}); db.people.insert({name: 'Ivan', street: 'Rodeo', city: 'Los Angeles'}); db.people.insert({name: 'Jie', street: 'La Brea', city: 'Inglewood'}); db.people.insert({name: 'Hiro', street: 'Wilton', city: 'Beverly Hills'}); db.people.insert({name: 'Sipho', street: 'Sixth', city: 'Los Angeles'}); db.people.insert({name: 'Luiza', street: 'Xidan', city: 'Beijing'}); db.people.insert({name: 'Kameke', street: 'Park', city: 'New York'}); db.people.insert({name: 'Kimiko', street: 'Yonge', city: 'Toronto'}); db.people.insert({name: 'Olivia', street: 'Xidan', city: 'Beijing'}); let ids = {}; db.people.find({}).forEach(d => ids[d.name.toLowerCase()] = d._id); db.people.update({name: 'Ellie'}, {$set: {manages: [ids.gwen, ids.jie]}}); db.people.update({name: 'Emily'}, {$set: {manages: [ids.karen]}}); db.people.update({name: 'Hiro'}, {$set: {manages: [ids.emily]}}); db.people.update({name: 'Mari'}, {$set: {manages: [ids.jie]}}); db.people.update({name: 'Luiza'}, {$set: {manages: [ids.mari, ids.olivia]}}); db.people.update({name: 'Mari'}, {$addToSet : {companies: {name: 'Riot', city: 'Los Angeles', salary: 125572.27}}}); db.people.update({name: 'Mari'}, {$addToSet : {companies: {name: 'IBM', city: 'San Jose', salary: 130000}}}); db.people.update({name: 'Karen'}, {$addToSet : {companies: {name: 'Criteo', city: 'Paris', salary: 93250}}}); db.people.update({name: 'Ellie'}, {$addToSet : {companies: {name: 'Tsujita', city: 'Los Angeles', salary: 75000}}}); db.people.update({name: 'Gwen'}, {$addToSet : {companies: {name: 'Tsujita', city: 'Los Angeles', salary: 25000}}}); db.people.update({name: 'Emily'}, {$addToSet : {companies: {name: 'Criteo', city: 'Paris', salary: 450000}}}); db.people.update({name: 'Emily'}, {$addToSet : {companies: {name: 'Google', city: 'Venice', salary: 200000}}}); db.people.update({name: 'Jie'}, {$addToSet : {companies: {name: 'Tsujita', city: 'Los Angeles', salary: 23350}}}); db.people.update({name: 'Jie'}, {$addToSet : {companies: {name: 'IBM', city: 'San Jose', salary: 85750.10}}}); db.people.update({name: 'Hiro'}, {$addToSet : {companies: {name: 'Google', city: 'Venice', salary: 115000}}}); db.people.update({name: 'Sipho'}, {$addToSet : {companies: {name: 'Snapchat', city: 'Santa Monica', salary: 132700}}}); db.people.update({name: 'Luiza'}, {$addToSet : {companies: {name: 'Criteo', city: 'Dubai', salary: 310000}}}); db.people.update({name: 'Kimiko'}, {$addToSet : {companies: {name: 'Sony', city: 'Culver City', salary: 89925}}}); db.people.update({name: 'Kimiko'}, {$addToSet : {companies: {name: 'Sony', city: 'Tokyo', salary: 118000}}}); db.people.update({name: 'Olivia'}, {$addToSet : {companies: {name: 'Criteo', city: 'Dubai', salary: 400000}}});
db.people.find({city: 'Los Angeles'}, {_id: 0, name: 1})
db.people.find({city: {$in: ['Beijing', 'West Hollywood']}}, {_id: 0, name: 1, street: 1, city: 1})
db.people.find({city: {$in: ['Beijing', 'West Hollywood']}}, {_id: 0, name: 1, street: 1, city: 1}).sort({name: 1})
db.people.find({"companies.name": "Tsujita"}, {_id: 0, name: 1, city: 1});
db.people.find({"companies.name": {$ne: "Tsujita"}})
db.people.aggregate([ {$match: {manages: {$exists: 1}}}, {$project: {name: 1, direct_reports: {$size: "$manages"}}} ])
db.people.aggregate([ {$unwind: "$companies"}, {$group: {_id: "$city", average_salary: {$avg: "$companies.salary"}}}, ])
db.people.aggregate([ {$unwind: "$companies"}, {$group: {_id: "$companies.name", num_people: {$sum: 1}}}, {$sort: {num_people: -1}}, {$limit: 1} ])
db.people.aggregate([ {$unwind: "$companies"}, {$group: {_id: "$companies.name", num_people: {$sum: 1}}}, {$sort: {num_people: -1}}, {$limit: 1} ])
db.people.aggregate([ {$unwind: "$companies"}, {$group: { _id: "$companies.name", num_people: {$sum: 1}, payroll: {$sum: "$companies.salary"}, min_salary: {$min: "$companies.salary"}, max_salary: {$max: "companies.salary"}, avg_salary: {$avg: "$companies.salary"} }} ])