MongoDB:通过最大聚合匹配和分组

时间:2019-10-24 18:26:35

标签: mongodb mongoose mongodb-query aggregation-framework

我想展示所有死于最高年龄的民主党总统的死亡年龄。

我的查询是:

db.PRESIDENT.aggregate([
  { $match: { PARTY: "Democratic" } },
  { $group: { "_id": null, "Maximum_Death_Age": { $max: "$DEATH_AGE" } } }
]);

我得到的输出:

{ "_id" : null, "Maximum_Death_Age" : "" }

收藏:

image

输出图像: enter image description here

1 个答案:

答案 0 :(得分:0)

正如您在评论中提到的。因为DEATH_AGE包含空字符串"",所以它会扰乱$max的比较操作及其输出。

注意:如果字段DEATH_AGE为空(不存在)或为null会产生预期的结果。

一种解决方法可能是在比赛阶段简单过滤掉没有死掉的总统

查询:

db.collection.aggregate([
  {
    $match: {
      "PARTY": "Democratic",
      "DEATH_AGE": {
        "$exists": true,
        "$ne": ""
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "Maximum_Death_Age": {
        "$max": "$DEATH_AGE"
      }
    }
  }
])

替代查询:(在不强制使用$max$group的情况下),按DEATH_AGE降序排序,并选择第一个{{1} }

$limit

上面的查询也可能是一个优化的查询,因为文档中说:

  

当$ sort在$ limit之前并且没有中间阶段时   修改文档的数量,优化器可以合并   将$ limit放入$ sort。这允许$ sort操作仅   保持进程前进的前n个结果,其中n是指定的   限制,并确保MongoDB仅需要在内存中存储n个项目。