MAPREDUCE Elite: Difference between revisions
From NoSQLZoo
Add Q6 js and minify Q5. |
m Further minify / tidy. |
||
| Line 1: | Line 1: | ||
==Introducing the elite database | ==Introducing the elite database== | ||
These questions will introduce the "elite" database, which contains data about the video game [https://www.elitedangerous.com/ Elite Dangerous]<br/><br/><br/> | These questions will introduce the "elite" database, which contains data about the video game [https://www.elitedangerous.com/ Elite Dangerous]<br/><br/><br/> | ||
There are two collections, <code>commodities</code> and <code>systems</code>.<br/>Inside <code>systems</code> there are nested documents called <code>stations</code>.<br/> | There are two collections, <code>commodities</code> and <code>systems</code>.<br/>Inside <code>systems</code> there are nested documents called <code>stations</code>.<br/> | ||
| Line 5: | Line 5: | ||
Keys used in this database. | Keys used in this database. | ||
<pre> | <pre> | ||
commodities: | commodities: | ||
_id, average_price, category, name | _id, average_price, category, name | ||
systems: | systems: | ||
_id, allegiance, faction, government, name, population, primary_economy, security, state, stations, updated_at, x, y, z | _id, allegiance, faction, government, name, population, primary_economy, security, state, stations, updated_at, x, y, z | ||
systems.stations: | systems.stations: | ||
allegiance, distance_to_star, economies, export_commodities,has_blackmarket, has_commodities, has_rearm, has_repair, | allegiance, distance_to_star, economies, export_commodities,has_blackmarket, has_commodities, has_rearm, has_repair, | ||
has_shipyard, has_outfitting, faction, government, listings, max_landing_pad, name, state, type, updated_at | has_shipyard, has_outfitting, faction, government, listings, max_landing_pad, name, state, type, updated_at | ||
systems.stations.listings: | systems.stations.listings: | ||
buy_price, collected_at, demand, commodity, sell_price, supply, update_count | buy_price, collected_at, demand, commodity, sell_price, supply, update_count | ||
</pre> | </pre> | ||
Read more about the structure here: [[Elite Document Structure]] | Read more about the structure here: [[Elite Document Structure]] | ||
| Line 69: | Line 66: | ||
<pre class="ans">db.systems.mapReduce(function(){if (!isNaN(this.population) && this.allegiance!=null && this.allegiance!="Independent" && this.allegiance!="Anarchy"){emit(this.allegiance, this.population);}},function(k,v){return Array.sum(v);},{out:{inline:1}})</pre> | <pre class="ans">db.systems.mapReduce(function(){if (!isNaN(this.population) && this.allegiance!=null && this.allegiance!="Independent" && this.allegiance!="Anarchy"){emit(this.allegiance, this.population);}},function(k,v){return Array.sum(v);},{out:{inline:1}})</pre> | ||
</div> | </div> | ||
==Harder Questions== | ==Harder Questions== | ||
<div class="q" data-lang="mongo" data-switches='elite'>How much Hydrogen Fuel is owned by stations in systems. Limit your query to the first 5000 stations. | <div class="q" data-lang="mongo" data-switches='elite'>How much Hydrogen Fuel is owned by stations in systems. Limit your query to the first 5000 stations. | ||
| Line 86: | Line 82: | ||
) | ) | ||
</pre> | </pre> | ||
<pre class="ans"> | <pre class="ans">db.systems.mapReduce(function(){if(this.stations)for(let i=0;i<this.stations.length;i++){let t=this.stations[i];if(t.listings&&t.allegiance)for(let s=0;s<t.listings.length;s++){let n=t.listings[s];"Hydrogen Fuel"===n.commodity&&emit(t.allegiance,n.supply)}}},function(i,t){return Array.sum(t)},{out:{inline:1},limit:5e3});</pre> | ||
db.systems.mapReduce( | |||
); | |||
</pre> | |||
</div> | </div> | ||
<div class="q" data-lang="mongo" data-switches='elite'>A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> | <div class="q" data-lang="mongo" data-switches='elite'>A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> | ||
Revision as of 23:54, 22 March 2018
Introducing the elite database
These questions will introduce the "elite" database, which contains data about the video game Elite Dangerous
There are two collections, commodities and systems.
Inside systems there are nested documents called stations.
A system has many stations, and a station has many trade listings.
Keys used in this database.
commodities:
_id, average_price, category, name
systems:
_id, allegiance, faction, government, name, population, primary_economy, security, state, stations, updated_at, x, y, z
systems.stations:
allegiance, distance_to_star, economies, export_commodities,has_blackmarket, has_commodities, has_rearm, has_repair,
has_shipyard, has_outfitting, faction, government, listings, max_landing_pad, name, state, type, updated_at
systems.stations.listings:
buy_price, collected_at, demand, commodity, sell_price, supply, update_count
Read more about the structure here: Elite Document Structure
Questions
commodities collection contains the name and average_price of each commodity.There are 99 unique commodities and 15 categories.
Find the average price of each category, round to the nearest whole number.
db.commodities.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.commodities.mapReduce(function(){emit(this.category,this.average_price);},function(k,v){return Math.round(Array.sum(v)/v.length);},{out:{inline:1}})
allegiance. There are three main factions: The Federation, The Empire, and The Alliance.Non-populated systems without stations do not have an allegiance, and should be ignored.
Show the amount of systems following each type of allegiance.
db.systems.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.systems.mapReduce(function(){if (this.allegiance!=null){emit(this.allegiance,1);}},function(k,v){return Array.sum(v);},{out:{inline:1}})What are the populations of the three main factions?
!isNaN().db.systems.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.systems.mapReduce(function(){if (!isNaN(this.population) && this.allegiance!=null && this.allegiance!="Independent" && this.allegiance!="Anarchy"){emit(this.allegiance, this.population);}},function(k,v){return Array.sum(v);},{out:{inline:1}})
Harder Questions
The amount of stations and the amount of listings aren't fixed, you'll need to query to ensure that they exist and find a way of iterating through them in your map stage.
db.commodities.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.systems.mapReduce(function(){if(this.stations)for(let i=0;i<this.stations.length;i++){let t=this.stations[i];if(t.listings&&t.allegiance)for(let s=0;s<t.listings.length;s++){let n=t.listings[s];"Hydrogen Fuel"===n.commodity&&emit(t.allegiance,n.supply)}}},function(i,t){return Array.sum(t)},{out:{inline:1},limit:5e3});
power_control_faction or Power is an individual or organisation who is in control of a system.These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do.
{ '_id': 'Zemina Torval',
'value': { 'alliance': 0.0,
'anarchy': 0.0,
'empire': 39.0,
'federation': 3.0,
'independent': 5.0}}]
Show the allegiance of each of the power's systems
db.commodities.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.systems.mapReduce(function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{Alliance:1,Anarchy:0,Empire:0,Federation:0,Independent:0});break;case "Anarchy":emit(this.power_control_faction,{Alliance:0,Anarchy:1,Empire:0,Federation:0,Independent:0});break;case "Empire":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:1,Federation:0,Independent:0});break;case "Federation":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:0,Federation:1,Independent:0});break;case "Independent":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:0,Federation:0,Independent:1});break;}},function(k,v){let a=v[0];for(let i=1;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance;a.Anarchy+=b.Anarchy;a.Empire+=b.Empire;a.Federation+=b.Federation;a.Independent+=b.Independent;}return a;},{out:{"inline":1},query:{"power_control_faction":{"$exists":1}}})
Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.
Zemina Torval: Empire(39.0)db.commodities.mapReduce(
function(){
emit(1,1);
},
function(k,v){
return Array.sum(v);
},
{out:{inline:1}}
)
db.systems.mapReduce(function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{Alliance:1,Anarchy:0,Empire:0,Federation:0,Independent:0});break;case "Anarchy":emit(this.power_control_faction,{Alliance:0,Anarchy:1,Empire:0,Federation:0,Independent:0});break;case "Empire":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:1,Federation:0,Independent:0});break;case "Federation":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:0,Federation:1,Independent:0});break;case "Independent":emit(this.power_control_faction,{Alliance:0,Anarchy:0,Empire:0,Federation:0,Independent:1});break;}},function(k,v){let a=v[0]; for(let i=1;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance;a.Anarchy+=b.Anarchy;a.Empire+=b.Empire;a.Federation+=b.Federation;a.Independent+=b.Independent;}return a;},{finalize:function(k,v){return Object.keys(v).reduce((a,b)=>v[a]>v[b]?a:b);},out:{"inline":1},query:{"power_control_faction":{"$exists":1}}})