Difference between revisions of "AGGREGATE Tutorial"
Line 5: | Line 5: | ||
<div class='extra_space' style='width:1em; height:6em;'></div> | <div class='extra_space' style='width:1em; height:6em;'></div> | ||
==Per Capita GDP== | ==Per Capita GDP== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Give the <code>name</code> and the <code>per capita GDP</code> for those countries with a <code>population</code> of at least 200 million. | Give the <code>name</code> and the <code>per capita GDP</code> for those countries with a <code>population</code> of at least 200 million. | ||
<div class="hint" title="How to calculate per capita GDP"> | <div class="hint" title="How to calculate per capita GDP"> | ||
per capita GDP is the GDP divided by the population. | per capita GDP is the GDP divided by the population. | ||
</div> | </div> | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
{$match:{ | {$match:{ | ||
Line 21: | Line 21: | ||
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki>db.world.aggregate([{"$match":{"population":{"$gte":200000000}}},{"$project":{"_id":0,"name":1,"per capita GDP": {"$divide": ["$gdp","$population"]}}}]) |
− | </ | + | </nowiki></pre> |
</div> | </div> | ||
==Population Density in South America== | ==Population Density in South America== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Give the <code>name</code> and the <code>population density</code> of all countries in South America. | Give the <code>name</code> and the <code>population density</code> of all countries in South America. | ||
<div class="hint" title="How to calculate population density"> | <div class="hint" title="How to calculate population density"> | ||
Line 34: | Line 34: | ||
Use a <code>$match</code>. <code>{"area":{"$ne":0}}</code> | Use a <code>$match</code>. <code>{"area":{"$ne":0}}</code> | ||
</div> | </div> | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
{$match:{continent:'Asia'}}, | {$match:{continent:'Asia'}}, | ||
Line 43: | Line 43: | ||
}}, | }}, | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | db.world.aggregate([ | + | db.world.aggregate([{$match:{continent:'South America'}},{$project:{_id:0,name:1,density:{$divide:["$population","$area"]}}}]) |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | ]) | ||
</div> | </div> | ||
− | |||
− | |||
==Population Density for "V"== | ==Population Density for "V"== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Give the <code>name</code> and the <code>population density</code> of all countries with name after V in the alphabet. | Give the <code>name</code> and the <code>population density</code> of all countries with name after V in the alphabet. | ||
<p>Note that because Vatican City (with area 0) is in Europe you will get a divide by zero error unless you filter first. | <p>Note that because Vatican City (with area 0) is in Europe you will get a divide by zero error unless you filter first. | ||
Line 73: | Line 65: | ||
</pre> | </pre> | ||
</div> | </div> | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | < | ||
− | |||
db.world.aggregate([ | db.world.aggregate([ | ||
− | {$match:{name:{$gt:'V' | + | {$match: {name: {$gt: 'V'}}}, |
− | + | {$project: { | |
− | {$project:{ | + | _id: 0, |
− | _id:0, | + | name: 1, |
− | name:1, | + | area: 1 |
− | |||
}} | }} | ||
]) | ]) | ||
+ | </nowiki></pre> | ||
+ | <pre class="ans"><nowiki> | ||
+ | db.world.aggregate([{$match:{name:{$gt:'V'}}},{$match:{area:{"$ne":0}}},{$project:{_id:0,name:1,density:{$divide:["$population","$area"]}}}]) | ||
+ | </nowiki></pre> | ||
</div> | </div> | ||
− | |||
− | |||
==Population in millions== | ==Population in millions== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Show the <code>name</code> and <code>population</code> in millions for the countries of the continent <b>South America</b>. Divide the population by 1000000 to get population in millions. | Show the <code>name</code> and <code>population</code> in millions for the countries of the continent <b>South America</b>. Divide the population by 1000000 to get population in millions. | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
{$match:{ | {$match:{ | ||
Line 105: | Line 88: | ||
}}, | }}, | ||
{$project:{ | {$project:{ | ||
− | _id:0, | + | _id: 0, |
− | name:1 | + | name: 1 |
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
db.world.aggregate([{"$match":{"continent":{"$eq":"South America"}}},{"$project":{"_id":0,"name":1,"population":{"$divide":["$population",1000000]}}}]) | db.world.aggregate([{"$match":{"continent":{"$eq":"South America"}}},{"$project":{"_id":0,"name":1,"population":{"$divide":["$population",1000000]}}}]) | ||
− | </ | + | </nowiki></pre> |
</div> | </div> | ||
==Population density== | ==Population density== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Show the <code>name</code> and <code>population density</code> for <b>France</b>, <b>Germany</b>, and <b>Italy</b> | Show the <code>name</code> and <code>population density</code> for <b>France</b>, <b>Germany</b>, and <b>Italy</b> | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
{$match:{ | {$match:{ | ||
− | name: {$in:['United Kingdom','United States','Brazil']}, | + | name: {$in: ['United Kingdom', 'United States', 'Brazil']}, |
population: {$ne: null}, | population: {$ne: null}, | ||
area: {$ne: 0} | area: {$ne: 0} | ||
}}, | }}, | ||
{$project:{ | {$project:{ | ||
− | _id:0, | + | _id: 0, |
− | name:1 | + | name: 1 |
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
db.world.aggregate([{"$match":{"name":{"$in":['France','Germany','Italy']},"population":{"$ne":null},"area":{"$ne":0}}},{"$project":{"_id":0,"name":1,"population density":{"$divide":["$population","$area"]}}}]) | db.world.aggregate([{"$match":{"name":{"$in":['France','Germany','Italy']},"population":{"$ne":null},"area":{"$ne":0}}},{"$project":{"_id":0,"name":1,"population density":{"$divide":["$population","$area"]}}}]) | ||
+ | </nowiki></pre> | ||
</div> | </div> | ||
− | |||
− | |||
==Continents by area== | ==Continents by area== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Order the <code>continents</code> by <code>area</code> from most to least. | Order the <code>continents</code> by <code>area</code> from most to least. | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
− | {$group:{ | + | {$group: { |
− | _id:"$name", | + | _id: "$name", |
− | area:{$max: "$area"} | + | area: {$max: "$area"} |
}}, | }}, | ||
− | {$sort:{ | + | {$sort: { |
area: -1 | area: -1 | ||
}}, | }}, | ||
− | {$project:{ | + | {$project: { |
− | _id:1, | + | _id: 1, |
− | area:1 | + | area: 1 |
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | + | db.world.aggregate([{"$group":{"_id":"$continent","area":{"$sum":"$area"}}},{"$sort":{"area":-1}},{"$project":{"_id":1,"area":1}}]) | |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
</div> | </div> | ||
==Big Continents== | ==Big Continents== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Show the only two continents with total area greater than 25000000 and then sort from largest to smallest. | Show the only two continents with total area greater than 25000000 and then sort from largest to smallest. | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
− | {$match:{ | + | {$match: { |
− | continent:"North America" | + | continent: "North America" |
}}, | }}, | ||
− | {$project:{ | + | {$project: { |
− | _id:0, | + | _id: 0, |
− | name:1 | + | name: 1 |
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | db.world.aggregate([ | + | db.world.aggregate([{$group:{_id:"$continent",area:{$sum:"$area"}}},{$sort:{area:-1}},{$match:{area:{$gt:25000000}}}]) |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ]) | ||
</div> | </div> | ||
− | |||
− | |||
==First and last country by continent== | ==First and last country by continent== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
For each continent show the first and last country alphabetically like this: | For each continent show the first and last country alphabetically like this: | ||
{ "_id" : "Africa", "from" : "Algeria", "to" : "Zimbabwe" } | { "_id" : "Africa", "from" : "Algeria", "to" : "Zimbabwe" } | ||
Line 212: | Line 170: | ||
{ "_id" : "Oceania", "from" : "Australia", "to" : "Vanuatu" } | { "_id" : "Oceania", "from" : "Australia", "to" : "Vanuatu" } | ||
{ "_id" : "South America", "from" : "Argentina", "to" : "Venezuela" } | { "_id" : "South America", "from" : "Argentina", "to" : "Venezuela" } | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
{$group:{ | {$group:{ | ||
Line 221: | Line 179: | ||
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | db.world.aggregate([ | + | db.world.aggregate([{$sort:{name:1}},{$group:{_id:'$continent',from:{$first:'$name'},to:{$last:'$name'}},},{$sort:{_id:1}}]) |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ]) | ||
</div> | </div> | ||
− | |||
− | |||
==Countries beginning with...== | ==Countries beginning with...== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Group countries according to the first letter of the name. As shown. | Group countries according to the first letter of the name. As shown. | ||
Only give "U" through to "Z". | Only give "U" through to "Z". | ||
You will need to use the '''$substr''' function and the '''$push''' aggregate function. | You will need to use the '''$substr''' function and the '''$push''' aggregate function. | ||
+ | <pre><nowiki> | ||
{ "_id" : "U", "list" : [ "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan" ] } | { "_id" : "U", "list" : [ "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan" ] } | ||
{ "_id" : "V", "list" : [ "Vanuatu", "Vatican City", "Venezuela", "Vietnam" ] } | { "_id" : "V", "list" : [ "Vanuatu", "Vatican City", "Venezuela", "Vietnam" ] } | ||
{ "_id" : "Y", "list" : [ "Yemen" ] } | { "_id" : "Y", "list" : [ "Yemen" ] } | ||
{ "_id" : "Z", "list" : [ "Zambia", "Zimbabwe" ] } | { "_id" : "Z", "list" : [ "Zambia", "Zimbabwe" ] } | ||
− | <pre class=def> | + | </nowiki></pre> |
+ | <pre class="def"><nowiki> | ||
db.world.aggregate([ | db.world.aggregate([ | ||
− | + | {$project: { | |
− | + | _id: '$name', | |
− | + | startsWith: {$substr: ['$name', 0, 1]} | |
− | + | }}, | |
− | + | {$match: { | |
− | + | _id: {$gte: 'U'} | |
− | + | }}, | |
− | + | {$sort: {_id: 1}} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
]) | ]) | ||
+ | </nowiki></pre> | ||
+ | <pre class="ans"><nowiki> | ||
+ | db.world.aggregate([{$group:{_id:{$substr:['$name',0,1]},list:{$push:'$name'}}},{$match:{_id:{$gte:'U'}}},{$sort:{_id:1}}]) | ||
+ | </nowiki></pre> | ||
</div> | </div> | ||
− | |||
− | |||
==Harder Questions== | ==Harder Questions== | ||
− | |||
==Messing with continent names== | ==Messing with continent names== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Combine <b>North America</b> and <b>South America</b> to <b>America</b>, and then list the continents by area. Biggest first. | Combine <b>North America</b> and <b>South America</b> to <b>America</b>, and then list the continents by area. Biggest first. | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
− | + | {$group: { | |
− | + | _id: { | |
− | + | $cond: [ | |
− | + | {$eq: ["$continent", "North America"]}, | |
− | + | "America", | |
− | + | {$cond: [ | |
− | + | {$eq: ["$continent", "Asia"]}, | |
− | + | "The East", | |
− | + | "$continent" | |
− | + | ]} | |
− | + | ] | |
− | + | }, | |
− | + | area: {$sum: "$area"} | |
− | + | }}, | |
+ | {$sort: {area: -1}}, | ||
+ | {$project: { | ||
+ | _id: 1, | ||
+ | area: 1 | ||
+ | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
db.world.aggregate([{"$group":{"_id":{"$cond":[{"$eq":["$continent","South America"]},"America",{"$cond":[{"$eq":["$continent","North America"]},"America","$continent"]}]},"area":{"$sum":"$area"}}},{"$sort":{"area":-1}},{"$project":{"_id":1,"area":1}}]) | db.world.aggregate([{"$group":{"_id":{"$cond":[{"$eq":["$continent","South America"]},"America",{"$cond":[{"$eq":["$continent","North America"]},"America","$continent"]}]},"area":{"$sum":"$area"}}},{"$sort":{"area":-1}},{"$project":{"_id":1,"area":1}}]) | ||
− | </ | + | </nowiki></pre> |
</div> | </div> | ||
==Messing with continent names 2== | ==Messing with continent names 2== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Show the <b>name</b> and the <b>continent</b> for countries beginning with N - but replace the continent <b>Oceania</b> with <b>Australasia</b>. | Show the <b>name</b> and the <b>continent</b> for countries beginning with N - but replace the continent <b>Oceania</b> with <b>Australasia</b>. | ||
− | <pre class=def> | + | <pre class="def"><nowiki> |
db.world.aggregate([ | db.world.aggregate([ | ||
− | {$match:{ | + | {$match: { |
− | name:{$regex:"^N"} | + | name: {$regex: "^N"} |
}}, | }}, | ||
− | {$project:{ | + | {$project: { |
− | _id:0, | + | _id: 0, |
− | name:1 | + | name: 1 |
}} | }} | ||
]) | ]) | ||
− | </pre> | + | </nowiki></pre> |
− | < | + | <pre class="ans"><nowiki> |
db.world.aggregate([{"$match":{"name":{"$regex":"^N"}}},{"$project":{"_id":0,"name":1,"continent":{"$cond":[{"$eq":["$continent","Oceania"]},"Australasia","$continent"]}}}]) | db.world.aggregate([{"$match":{"name":{"$regex":"^N"}}},{"$project":{"_id":0,"name":1,"continent":{"$cond":[{"$eq":["$continent","Oceania"]},"Australasia","$continent"]}}}]) | ||
− | </ | + | </nowiki></pre> |
</div> | </div> | ||
==Messing with continent names 3== | ==Messing with continent names 3== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Show the <b>name</b> and the <b>continent</b> but:<br/><br/> | Show the <b>name</b> and the <b>continent</b> but:<br/><br/> | ||
− | + | *substitute <b>Eurasia</b> for <b>Europe</b> and <b>Asia</b>.<br/> | |
− | + | *substitute <b>America</b> - for each country in <b>North America</b> or <b>South America</b> or <b>Caribbean</b>.<br/><br/>Only show countries beginning with <b>A</b> or <b>B</b><br/> | |
If you're struggling you may want to experiment with <code>$and</code>,<code>$or</code>, etc. | If you're struggling you may want to experiment with <code>$and</code>,<code>$or</code>, etc. | ||
− | <pre class=def></pre> | + | <pre class="def"></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | db.world.aggregate([ | + | db.world.aggregate([{$match:{name:{$regex:"^A|^B"}}},{$project:{_id:0,name:1,continent:{$cond:[{$or:[{$eq:["$continent","Europe"]},{$eq:["$continent","Asia"]}]},"Eurasia",{$cond:[{$or:[{$eq:["$continent","North America"]},{$eq:["$continent","South America"]},{$eq:["$continent","Caribbean"]}]},"America","$continent"]}]}}}]) |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ]) | ||
− | </ | ||
</div> | </div> | ||
==Messing with continent names 4== | ==Messing with continent names 4== | ||
− | <div class=q data-lang="mongo"> | + | <div class="q" data-lang="mongo"> |
Put the continents right... | Put the continents right... | ||
<br/><br/> | <br/><br/> | ||
− | + | *<b>Oceania</b> becomes <b>Australasia</b><br/> | |
− | + | *Countries in <b>Eurasia</b> and <b>Turkey</b> go to <b>Europe/Asia</b><br/> | |
− | + | *<b>Caribbean</b> islands starting with '<b>B</b>' go to <b>North America</b>, other Caribbean islands go to <b>South America</b><br/> | |
<br/><br/> | <br/><br/> | ||
<b>Show the name, the original continent and the new continent of all countries.</b> | <b>Show the name, the original continent and the new continent of all countries.</b> | ||
− | <pre class=def></pre> | + | <pre class="def"></pre> |
− | < | + | <pre class="ans"><nowiki> |
− | + | db.world.aggregate([{"$project":{"_id":0,"name":1,"original":"$continent","new":{"$cond":[{"$or":[{"$eq":["$continent","Eurasia"]},{"$eq":["$name","Turkey"]}]},"Europe/Asia",{"$cond":[{"$eq":["$continent","Oceania"]},"Australasia",{"$cond":[{"$and":[{"$eq":["$continent","Caribbean"]},{"$eq":[{"$substr":["$name",0,1]},"B"]}]},"North America",{"$cond":[{"$and":[{"$eq":["$continent","Caribbean"]},{"$ne":[{"$substr":["$name",0,1]},"B"]}]},"South America","$continent"]}]}]}]}}}]) | |
− | + | </nowiki></pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
</div> | </div> |
Revision as of 11:58, 15 June 2018
Contents
- 1 Country Profile
- 2 Per Capita GDP
- 3 Population Density in South America
- 4 Population Density for "V"
- 5 Population in millions
- 6 Population density
- 7 Continents by area
- 8 Big Continents
- 9 First and last country by continent
- 10 Countries beginning with...
- 11 Harder Questions
- 12 Messing with continent names
- 13 Messing with continent names 2
- 14 Messing with continent names 3
- 15 Messing with continent names 4
Country Profile
For these questions you should use aggregate([])
on the collection world
You may find these AGGREGATE examples useful.
Per Capita GDP
Give the name
and the per capita GDP
for those countries with a population
of at least 200 million.
per capita GDP is the GDP divided by the population.
db.world.aggregate([ {$match:{ population:{$gte:250000000} }}, {$project:{ _id:0, name:1, "per capita GDP": {$divide: ['$gdp',1000000]} }} ])
db.world.aggregate([{"$match":{"population":{"$gte":200000000}}},{"$project":{"_id":0,"name":1,"per capita GDP": {"$divide": ["$gdp","$population"]}}}])
Population Density in South America
Give the name
and the population density
of all countries in South America.
population density is the population divided by the area
Use a $match
. {"area":{"$ne":0}}
db.world.aggregate([ {$match:{continent:'Asia'}}, {$project:{ _id:0, name:1, density: {$divide: ["$population","$area"]} }}, ])
db.world.aggregate([{$match:{continent:'South America'}},{$project:{_id:0,name:1,density:{$divide:["$population","$area"]}}}])
Population Density for "V"
Give the name
and the population density
of all countries with name after V in the alphabet.
Note that because Vatican City (with area 0) is in Europe you will get a divide by zero error unless you filter first.
Use a $match
.
{ $match: { area: { "$ne": 0 } } }
db.world.aggregate([ {$match: {name: {$gt: 'V'}}}, {$project: { _id: 0, name: 1, area: 1 }} ])
db.world.aggregate([{$match:{name:{$gt:'V'}}},{$match:{area:{"$ne":0}}},{$project:{_id:0,name:1,density:{$divide:["$population","$area"]}}}])
Population in millions
Show the name
and population
in millions for the countries of the continent South America. Divide the population by 1000000 to get population in millions.
db.world.aggregate([ {$match:{ }}, {$project:{ _id: 0, name: 1 }} ])
db.world.aggregate([{"$match":{"continent":{"$eq":"South America"}}},{"$project":{"_id":0,"name":1,"population":{"$divide":["$population",1000000]}}}])
Population density
Show the name
and population density
for France, Germany, and Italy
db.world.aggregate([ {$match:{ name: {$in: ['United Kingdom', 'United States', 'Brazil']}, population: {$ne: null}, area: {$ne: 0} }}, {$project:{ _id: 0, name: 1 }} ])
db.world.aggregate([{"$match":{"name":{"$in":['France','Germany','Italy']},"population":{"$ne":null},"area":{"$ne":0}}},{"$project":{"_id":0,"name":1,"population density":{"$divide":["$population","$area"]}}}])
Continents by area
Order the continents
by area
from most to least.
db.world.aggregate([ {$group: { _id: "$name", area: {$max: "$area"} }}, {$sort: { area: -1 }}, {$project: { _id: 1, area: 1 }} ])
db.world.aggregate([{"$group":{"_id":"$continent","area":{"$sum":"$area"}}},{"$sort":{"area":-1}},{"$project":{"_id":1,"area":1}}])
Big Continents
Show the only two continents with total area greater than 25000000 and then sort from largest to smallest.
db.world.aggregate([ {$match: { continent: "North America" }}, {$project: { _id: 0, name: 1 }} ])
db.world.aggregate([{$group:{_id:"$continent",area:{$sum:"$area"}}},{$sort:{area:-1}},{$match:{area:{$gt:25000000}}}])
First and last country by continent
For each continent show the first and last country alphabetically like this:
{ "_id" : "Africa", "from" : "Algeria", "to" : "Zimbabwe" } { "_id" : "Asia", "from" : "Afghanistan", "to" : "Yemen" } { "_id" : "Caribbean", "from" : "Antigua and Barbuda", "to" : "Trinidad and Tobago" } { "_id" : "Eurasia", "from" : "Armenia", "to" : "Russia" } { "_id" : "Europe", "from" : "Albania", "to" : "Vatican City" } { "_id" : "North America", "from" : "Belize", "to" : "United States" } { "_id" : "Oceania", "from" : "Australia", "to" : "Vanuatu" } { "_id" : "South America", "from" : "Argentina", "to" : "Venezuela" }
db.world.aggregate([ {$group:{ _id:"$continent" }}, {$sort:{ _id:1 }} ])
db.world.aggregate([{$sort:{name:1}},{$group:{_id:'$continent',from:{$first:'$name'},to:{$last:'$name'}},},{$sort:{_id:1}}])
Countries beginning with...
Group countries according to the first letter of the name. As shown. Only give "U" through to "Z".
You will need to use the $substr function and the $push aggregate function.
{ "_id" : "U", "list" : [ "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan" ] } { "_id" : "V", "list" : [ "Vanuatu", "Vatican City", "Venezuela", "Vietnam" ] } { "_id" : "Y", "list" : [ "Yemen" ] } { "_id" : "Z", "list" : [ "Zambia", "Zimbabwe" ] }
db.world.aggregate([ {$project: { _id: '$name', startsWith: {$substr: ['$name', 0, 1]} }}, {$match: { _id: {$gte: 'U'} }}, {$sort: {_id: 1}} ])
db.world.aggregate([{$group:{_id:{$substr:['$name',0,1]},list:{$push:'$name'}}},{$match:{_id:{$gte:'U'}}},{$sort:{_id:1}}])
Harder Questions
Messing with continent names
Combine North America and South America to America, and then list the continents by area. Biggest first.
db.world.aggregate([ {$group: { _id: { $cond: [ {$eq: ["$continent", "North America"]}, "America", {$cond: [ {$eq: ["$continent", "Asia"]}, "The East", "$continent" ]} ] }, area: {$sum: "$area"} }}, {$sort: {area: -1}}, {$project: { _id: 1, area: 1 }} ])
db.world.aggregate([{"$group":{"_id":{"$cond":[{"$eq":["$continent","South America"]},"America",{"$cond":[{"$eq":["$continent","North America"]},"America","$continent"]}]},"area":{"$sum":"$area"}}},{"$sort":{"area":-1}},{"$project":{"_id":1,"area":1}}])
Messing with continent names 2
Show the name and the continent for countries beginning with N - but replace the continent Oceania with Australasia.
db.world.aggregate([ {$match: { name: {$regex: "^N"} }}, {$project: { _id: 0, name: 1 }} ])
db.world.aggregate([{"$match":{"name":{"$regex":"^N"}}},{"$project":{"_id":0,"name":1,"continent":{"$cond":[{"$eq":["$continent","Oceania"]},"Australasia","$continent"]}}}])
Messing with continent names 3
Show the name and the continent but:
- substitute Eurasia for Europe and Asia.
- substitute America - for each country in North America or South America or Caribbean.
Only show countries beginning with A or B
If you're struggling you may want to experiment with $and
,$or
, etc.
db.world.aggregate([{$match:{name:{$regex:"^A|^B"}}},{$project:{_id:0,name:1,continent:{$cond:[{$or:[{$eq:["$continent","Europe"]},{$eq:["$continent","Asia"]}]},"Eurasia",{$cond:[{$or:[{$eq:["$continent","North America"]},{$eq:["$continent","South America"]},{$eq:["$continent","Caribbean"]}]},"America","$continent"]}]}}}])
Messing with continent names 4
Put the continents right...
- Oceania becomes Australasia
- Countries in Eurasia and Turkey go to Europe/Asia
- Caribbean islands starting with 'B' go to North America, other Caribbean islands go to South America
Show the name, the original continent and the new continent of all countries.
db.world.aggregate([{"$project":{"_id":0,"name":1,"original":"$continent","new":{"$cond":[{"$or":[{"$eq":["$continent","Eurasia"]},{"$eq":["$name","Turkey"]}]},"Europe/Asia",{"$cond":[{"$eq":["$continent","Oceania"]},"Australasia",{"$cond":[{"$and":[{"$eq":["$continent","Caribbean"]},{"$eq":[{"$substr":["$name",0,1]},"B"]}]},"North America",{"$cond":[{"$and":[{"$eq":["$continent","Caribbean"]},{"$ne":[{"$substr":["$name",0,1]},"B"]}]},"South America","$continent"]}]}]}]}}}])