惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
D
Docker
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
月光博客
月光博客
S
SegmentFault 最新的问题
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI

szhshp 的第三边境研究所

假设, AI 把我代替的那一刻真的到来 | szhshp 的第三边境研究所 小傻瓜都能懂的 AstrBot QQ 机器人集成 MCP 功能实战指南 | szhshp 的第三边境研究所 《智人之上: 从石器时代到 AI 时代的信息网络简史》阅读笔记 | szhshp 的第三边境研究所 iPadOS 26 无法设置空间场景图片壁纸的解决方法 | szhshp 的第三边境研究所 《一路云海》(终) | szhshp 的第三边境研究所 《一路云海》(四): 如何不按套路旅行 | szhshp 的第三边境研究所 《一路云海》(三): In Ya Mellow Tone | szhshp 的第三边境研究所 《一路云海》(二): 关西世博参观纪实 | szhshp 的第三边境研究所 《一路云海》(一): 新的征程 | szhshp 的第三边境研究所 2025 大阪世博会 [ 3 天前-先到先得 ] 阶段 场馆预约必中独家攻略 | szhshp 的第三边境研究所 Hackathon 随想 | szhshp 的第三边境研究所 一杯双皮奶 | szhshp 的第三边境研究所 Armbian + CasaOS + NAS 配置指南 | szhshp 的第三边境研究所 Docker 构建镜像报错: error getting credentials - err: exit status 1, out: `` | szhshp 的第三边境研究所 Disqus RIP! 论过高的维护成本如何治疗固执的坏习惯 | szhshp 的第三边境研究所 炸弹猫桌游变体规则 | szhshp 的第三边境研究所 《小岛经济学》阅读笔记 | szhshp 的第三边境研究所 《金钱心理学》阅读笔记 | szhshp 的第三边境研究所 为知笔记 RIP: 迁移剩余的笔记 | szhshp 的第三边境研究所 2025 博客第十年展望 - 再见我的过去 | szhshp 的第三边境研究所 我在独立游戏里面致敬的作品 | szhshp 的第三边境研究所 《How to make thing faster》阅读笔记 | szhshp 的第三边境研究所 《The Art of Clean Code》阅读笔记 | szhshp 的第三边境研究所 《Clean Architecture: A Craftsman Guide to Software Structure and Design》阅读笔记 | szhshp 的第三边境研究所 《How AI Works》阅读笔记 | szhshp 的第三边境研究所 游戏策划废案 - Project Uranus | szhshp 的第三边境研究所 游戏策划废案 - Project X | szhshp 的第三边境研究所 人生第一款独立游戏开发复盘 | szhshp 的第三边境研究所 Trap of Life | szhshp 的第三边境研究所 如果我用手搓了个暗物质雏形 | szhshp 的第三边境研究所
Mongoose: aggregate() 方法实现聚合函数 | szhshp 的第三边...
2019-09-07 · via szhshp 的第三边境研究所

Meta

目录

需求描述

首先我有一个 Item 的 collection:

type Item {
  _id: String
  itemname: String!
    itemid: String!
    itemtype: String!
    parent_id: String
}

///////////////////
/// 主要是下面这一些部分

type Query {
  getItemSummary: ItemSummaryResponse
}
type ItemSummaryResponse {
  data: [ItemSummary]
  success: Boolean
}
type ItemSummary {
  _id: String
  count: Int
}

gql 端调用的方法:

{
  getItemSummary {
    data{
      _id
      count
    }
    success
  }
}

然按照其中的类别 (itemtype) 进行总计:

那么实际上在后台 mongoose 里面需要这么写:

getItemSummary: root => Item.aggregate([{
  $group: {
    _id: '$itemtype',
    count: {
      $sum: 1,
    },
  },
}, ]).then((res) => {
  if (res === null) {
    return {
      success: 0,
      errors: ['sadfsdfsdf']
    };
  }

  return ({
    success: 1,
    errors: [],
    data: res,
  });
}),

聚合函数 aggregate() 的使用

首先写明按照哪个 field 进行聚合

$group: {
    _id: '$itemtype', 
        // 这个地方比较重要,首先左边一定要写成 _id, 最后在前端通过 gql 取的时候也是写 _id
        // 另外重要是这个 key 的值是 $itemtype, 说明根据 itemtype 进行 group, 直接写 $ + fieldname 即可
    count: {
      $sum: 1,
    },
  },

因为 $group 里面对应需要聚合操作的列必须写成 _id , 否则会出现 The field 'xxx' must be an accumulator object 的报错信息

另外 SQL 的聚合函数都可以用到这里:

聚合管道

管道在 Unix 和 Linux 中一般用于将当前命令的输出结果作为下一个命令的参数。

基本上就是逐个执行聚合方法里面的方法.

上方的聚合函数仅仅执行了对一个 field 的聚合:

Item.aggregate([{
  $group: {
    _id: '$itemtype',
    count: {
      $sum: 1
    }
  }
}, ])

但是实际上可以在这些操作之前之后加更多的操作.

比如想要将,70 分到 90 分之间的数据先筛选出来再进行 group:

db.articles.aggregate([{
    $match: {
      score: {
        $gt: 70,
        $lte: 90
      }
    }
  },
  {
    $group: {
      _id: null,
      count: {
        $sum: 1
      }
    }
  }
]);

常用的几个操作

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。使用 MongoDB 的标准查询操作。
  • $limit:用来限制 MongoDB 聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

实例

$project 实例

0 为不显示,1 为显示,默认情况下 _id 字段是 1

db.articles.aggregate({
    $project: {
        _id: 0,
        title: 1,
        by_user: 1,
    }
});

 // 返回
{ "title" : "MongoDB Overview", "by_user" : "runoob.com" }
{ "title" : "NoSQL Overview", "by_user" : "runoob.com" }
{ "title" : "Neo4j Overview", "by_user" : "Neo4j" }

$match 实例

$match 用于获取分数大于 70 小于或等于 90 记录,然后将符合条件的记录送到下一阶段$group 管道操作符进行处理。

db.articles.aggregate([{
    $match: {
      score: {
        $gt: 70,
        $lte: 90
      }
    }
  },
  {
    $group: {
      _id: null,
      count: {
        $sum: 1
      }
    }
  }
]);

 // 返回
{ "_id" : null, "count" : 1 }

$skip 实例

经过 $skip 管道操作符处理后,前 2 个文档被”过滤”掉。

db.col_1.aggregate({ $skip: 2 });

参考文献

https://www.jianshu.com/p/baea1bce6de3