首页 > 解决方案 > MongoDB:使用最大聚合进行匹配和分组

问题描述

我想显示所有去世最年长的民主党总统的死亡年龄。

我的查询是:

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

我得到的输出:

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

收藏:

图片

输出图像: 在此处输入图像描述

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


正如你在评论中提到的。因为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并选择第一个$limit

db.collection.aggregate([
  {
    $match: {
      "PARTY": "Democratic",
      "DEATH_AGE": {
        "$exists": true,
        "$ne": ""
      }
    }
  },
  {
    $sort: {
      "DEATH_AGE": -1
    }
  },
  {
    $limit: 1
  }
]);

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

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


推荐阅读