有数据格式如下:
{ "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" } ] );
|