有数据格式如下:
{   "id": "745",   "knownName": {     "en": "A. Michael Spence",     "se": "A. Michael Spence"   },   "familyName": {     // 结构同上,下同     // ..   },   "orgName": {     // orgName 当获奖者为组织时出现     // ..   },   "gender": "male",   "nobelPrizes": [     {       "awardYear": "2001",       // ...       "affiliations": [         {           "name": {             "en": "Stanford University",             // ...           },           "city": {             // ...           },           "country": {             // ...           },           // ...         }       ]     }   ] }
  | 
 
想要实现:
- 查找名为 
CERN 的 affiliation 的所在国家 
- 查找获奖次数大于等于 5 次的 
familyName 
- 查找 
University of California 的不同所在位置总数 
- 查找至少一个诺贝尔奖授予组织而非个人的年份总数
 
查找名为 CERN 的 affiliation 的所在国家
需要注意的是 affiliations 是 nobelPrizes 下的数组(嵌套数组结构),因此需要分两次展开:
db.laureates.aggregate(   [          { $unwind: '$nobelPrizes' },          { $unwind: '$nobelPrizes.affiliations' },          { $match: { 'nobelPrizes.affiliations.name.en': 'CERN' } },          { $limit: 1 },          { $project: { '_id': 0, 'country': '$nobelPrizes.affiliations.country.en' } }   ] );
 
 
 
   | 
 
查找获奖次数大于等于 5 次的 familyName
这里需要用到 $group 操作,根据 familyName 来进行分组,并且需要提前计算好每条记录所获奖的数量:
db.laureates.aggregate(   [          { $project: { nobelPrizesLength: { $size: "$nobelPrizes" }, familyName: "$familyName.en" } },          { $match: { familyName: { $exists: !0, $ne: null } } },          { $group: { _id: "$familyName", count: { $sum: "$nobelPrizesLength" }, familyName: { $first: "$familyName" } } },          { $match: { count: { $gte: 5 } } },          { $project: { familyName: "$familyName", _id: 0 } }   ] );
 
 
 
 
   | 
 
查找 University of California 的不同所在位置总数
一个相比上个查询更简单的 group 查询:
db.laureates.aggregate(   [          { $unwind: "$nobelPrizes" },          { $unwind: "$nobelPrizes.affiliations" },          { $match: { "nobelPrizes.affiliations.name.en": "University of California" } },          { $group: { _id: "$nobelPrizes.affiliations.city.en" } },          { $count: "locations" }   ] );
 
 
 
   | 
 
查找至少一个诺贝尔奖授予组织而非个人的年份总数
这里注意 group 之前先把授予个人的记录筛除掉:
db.laureates.aggregate(   [          { $match: { orgName: { $exists: !0, $ne: null } } },          { $unwind: "$nobelPrizes" },          { $group: { _id: "$nobelPrizes.awardYear" } },          { $count: "years" }   ] );
 
 
 
   |