MAPREDUCE Elite
From NoSQLZoo
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: _id, 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: _id, 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
How much Hydrogen Fuel is owned by each faction? Limit your query to the first 5000 stations.
The amount of stations in a system and the amount of listings to a station aren't fixed. query
can be used to ensure that they exist.
db.systems.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 allegiance to a faction, but the systems they control do not nescessarily have the same allegiance that 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.systems.mapReduce( function(){ emit(1, 1); }, function(k,v){ return Array.sum(v); }, { query: {"power_control_faction": {"$exists": 1}}, out: {inline: 1} } );
db.systems.mapReduce(function(){emit(this.power_control_faction,{[this.allegiance]:1});},function(_,v){let a={"Alliance":0,"Anarchy":0,"Empire":0,"Federation":0,"Independent":0};for(let i=0;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance||0;a.Anarchy+=b.Anarchy||0;a.Empire+=b.Empire||0;a.Federation+=b.Federation||0;a.Independent+=b.Independent||0;}return a;},{out:{"inline":1},query:{"power_control_faction":{"$exists":1}},sort:{"_id":1}});
Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.
To achieve this, you'll need to use the finalize: function(k, v){}
in the third argument to find the key with the largest value.
{ "_id" : "Zemina Torval", "value" : "Empire" }
db.systems.mapReduce( function(){ emit(1, 1); }, function(k, v){ return Array.sum(v); }, { finally: function(k, v){ return v; }, query: {"power_control_faction": {"$exists": 1}}, out: {inline: 1} } );
db.systems.mapReduce(function(){emit(this.power_control_faction,{[this.allegiance]:1});},function(k,v){let a={"Alliance":0,"Anarchy":0,"Empire":0,"Federation":0,"Independent":0};for(let i=0;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance||0;a.Anarchy+=b.Anarchy||0;a.Empire+=b.Empire||0;a.Federation+=b.Federation||0;a.Independent+=b.Independent||0;}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}},sort:{"_id":1}});
Survey
Do you have thoughts about this website that you would like to share? Help improve NoSQLZoo!