MAPREDUCE Elite
From NoSQLZoo
#ENCODING
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-16')
#MONGO
from pymongo import MongoClient
client = MongoClient()
client.elite.authenticate('scott','tiger')
db = client['elite']
#PRETTY
import pprint
pp = pprint.PrettyPrinter(indent=4)
#JS
from bson.code import Code
Introducing the elite database **WORK IN PROGRESS
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 is 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
from bson.code import Code
pp.pprint(
db.commodities.find_one()
)
from bson.code import Code;temp = db.commodities.map_reduce( map=Code("function(){emit(this.category,this.average_price)}"), reduce=Code("""function(key,values){var total = 0;for (var i = 0; i < values.length; i++){total += values[i];}return Math.round(total/values.length);} """),out={"inline":1} );pp.pprint(temp['results'])
The Alliance consists of Independent systems, though Independent systems are not necessarily part of The Alliance. In such a case their allegiance will be "Independent"
Finally, there are a few systems that are Anarchists, and come under "Anarchy". Non-populated systems without stations do not have an allegiance, and should be ignored.
It's not possible to emit on a field that doesn't exist. Use query to remove documents where allegiance is N/A
Show the amount of systems for each type of allegiance.
temp = db.systems.map_reduce( query={"allegiance": {"$ne":None}}, map=Code("function(){emit(this.allegiance, {count: 1})}"), reduce=Code("""function(key,values){var total = 0;values.forEach(function(value){ total += value.count;});return {count: total};} """), out={"inline":1} );pp.pprint(temp['results'])