AGGREGATE Tutorial: Difference between revisions
From NoSQLZoo
No edit summary  | 
				|||
| 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
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"]}]}]}]}}}])