Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB 中Aggregate使用与相关限制

MongoDB 中Aggregate使用与相关限制

作者头像
王小明_HIT
发布于 2020-02-18 04:35:04
发布于 2020-02-18 04:35:04
94900
代码可运行
举报
文章被收录于专栏:程序员奇点程序员奇点
运行总次数:0
代码可运行

MongoDB分组怎么用?

官网:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

不指定字段分组

案例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollection('6117Decartes').aggregate( 
   [
    { 
    $group : { 
        _id : null,
        "count":{$sum:} } 
    } 
   ],
   {
        allowDiskUse: true
    } 
);

要注意的是,字段可被统计才行,否则会报错,看个例子。

代码 InstitutionID 是非统计字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollection('6117Decartes').aggregate( 
   [
    { 
    $group : { 
        _id : null,
        "InstitutionID":"$InstitutionID"
        } 
    } 
   ],
   {
        allowDiskUse: true
    } 
);
正确的写法是:
db.getCollection('6117Decartes').aggregate(
   [
    {
    $group : {
        _id : null,
        "InstitutionID":{$max:"$InstitutionID"}
        }
    }
   ],
   {
        allowDiskUse: true
    }
);

否则报错如下:

案例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.sales.insert([
    { "_id" : , "item" : "abc", "price" : , "quantity" : , "date" : ISODate("2014-03-01T08:00:00Z") },
    { "_id" : , "item" : "jkl", "price" : , "quantity" : , "date" : ISODate("2014-03-01T09:00:00Z") },
    { "_id" : , "item" : "xyz", "price" : , "quantity" : , "date" : ISODate("2014-03-15T09:00:00Z") },
    { "_id" : , "item" : "xyz", "price" : , "quantity" : , "date" : ISODate("2014-04-04T11:21:39.736Z") },
    { "_id" : , "item" : "abc", "price" : , "quantity" : , "date" : ISODate("2014-04-04T21:23:13.331Z") }
]);

不指定数据分组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.sales.aggregate(
   [
      {
        $group : {
           _id : null,
           minPrice:{$min:"$price"},    //最小值
           maxPrice:{$max:"$price"},    //最大值
           avgPrice:{ $avg: "$price" }, //平均值
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, //总价 $sum(price * quantity)
           lastItem:{$last:"$item"},    //取最后一条
           count: { $sum:  } // 总条目数
        }
      }
   ]
);

多字段分组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollection('6117Decartes').aggregate( 
   [
    { 
    $group : { 
        _id : {"InstitutionID":"$InstitutionID","logtype":"$logtype"},
        "总条目数":{$sum:} } 
    } 
   ],
   {
        allowDiskUse: true
    } 
);

案例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.sales.aggregate( 
   [
    { 
    $group : { 
        _id : {"商品":"$item", "价格":"$price"},
        "总条目数":{$sum:} } 
    } 
   ] 
);

将 $push 聚合分组指定到列结构到数组中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.books.insert([
    { "_id" : , "title" : "The Banquet", "author" : "Dante", "copies" :  },
    { "_id" : , "title" : "Divine Comedy", "author" : "Dante", "copies" :  },
    { "_id" : , "title" : "Eclogues", "author" : "Dante", "copies" :  },
    { "_id" : , "title" : "The Odyssey", "author" : "Homer", "copies" :  },
    { "_id" : , "title" : "Iliad", "author" : "Homer", "copies" :  }
]);
db.books.aggregate(
   [
     { $group : { _id : "$author", books: { $push: "$title" } } }
   ]
);

可能出现的问题:分组内存使用超过限制时错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
"message" : "Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in.",
"stack" : "MongoError: Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." +
              "at queryCallback (/tmp/.mount_nosqlbO7RhZG/app/resources/app.asar/node_modules/mongodb-core/lib/cursor.js:223:25)" +
              "at /tmp/.mount_nosqlbO7RhZG/app/resources/app.asar/node_modules/mongodb-core/lib/connection/pool.js:541:18" +
              "at _combinedTickCallback (internal/process/next_tick.js:131:7)" +
              "at process._tickCallback (internal/process/next_tick.js:180:9)",
"name" : "MongoError",
"ok" : ,
"errmsg" : "Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in.",
"code" : ,
"codeName" : "Location16945"
}

怎么解决?

  • id 字段是必须要的,如果不指定字段进行分组则用 null,表示不分组的统计;
  • 分组内存使用限制是100M,默认情况下如果超过了限制100M则会出现错误。如果想对超过100M的大数据进行处理,可以使用 allowDiskUse 选项来进行分组时写到磁盘临时文件中处理。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollection('6117Decartes').aggregate( 
   [
    { 
    $group : { 
        _id : {"InstitutionID":"$InstitutionID","logtype":"$logtype"},
        "总条目数":{$sum:} } 
    } 
   ],
   {
        allowDiskUse: true
    } 
);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB 中聚合统计计算 – $SUM表达式
我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种:1,统计符合条件的所有文档的某个字段的总和;2,统计每个文档的数组字段里面的各个数据值的和。这两种情况都可以通过$sum表达式来完成。以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。
星哥玩云
2022/08/18
1.7K0
[767]MongoDB聚合运算
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
周小董
2020/02/29
1.8K0
mongodb 学习五,聚合操作实操
在 users 里面准备一组数据,包含 item ,qty,status,tags 和 size 字段,其中 size 是内嵌文档,size 里面又包含了 h,w,uom 字段
阿兵云原生
2023/02/16
4760
硬货来了!轻松掌握 MongDB 流式聚合操作
信息科学中的聚合是指对相关数据进行内容筛选、处理和归类并输出结果的过程。MongoDB 中的聚合是指同时对多个文档中的数据进行处理、筛选和归类并输出结果的过程。数据在聚合操作的过程中,就像是水流过一节一节的管道一样,所以 MongoDB 中的聚合又被人称为流式聚合。
崔庆才
2019/10/08
4.8K0
硬货来了!轻松掌握 MongDB 流式聚合操作
MongoDB分组查询
MongoDB分组查询 设置显示要查询的列 显示 device_id,device_name,online_status,video_diag_time db.getCollection('vqd_result_his').find({},{device_id:1,device_name:1,online_status:1,video_diag_time:1}) 不显示 device_id,其他都显示 db.getCollection('vqd_result_his').find({},{device_i
编程随想曲
2022/04/21
2.2K0
超实用!手把手入门 MongoDB:这些坑点请一定远离
1.创建数据库语法 如果数据库不存在,则指向数据库,但不创建(等待实际数据入库时创建),否则切换到指定数据库。
程序员小助手
2022/12/20
5.8K0
超实用!手把手入门 MongoDB:这些坑点请一定远离
MongoDB使用小结:一些常用操作分享
本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。
拓荒者
2019/09/06
2K0
手把手教你 MongoDB 的安装与详细使用(二)
上一篇文章练习了,MongoDB 的以下操作
程序员鹏磊
2018/02/02
3.6K0
手把手教你 MongoDB 的安装与详细使用(二)
MongoDB教程(五):mongoDB聚合框架
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/07/20
2270
mongodb 分组查询、指定时间段查询
六月的雨在Tencent
2024/03/28
4210
MongoDB可视化工具Robo 3T基础使用
上一篇博客《最详细的Windows平台安装MongoDB教程》已经为大家详细介绍了安装MongoDB的过程。其中也提及到了MongoDB可视化工具Robo3T(当然,还有其他的工具)。通过本篇博客,你将学会使用Robo3T的基本功能。
大数据梦想家
2021/01/27
3.9K0
MongoDB可视化工具Robo 3T基础使用
MongoDB 极简入门实践
传统的计算机应用大多使用关系型数据库来存储数据,比如大家可能熟悉的 MySQL、Sqlite 等等,它的特点是数据以表(table)的形式储存起来的。数据库由一张张排列整齐的表格构成,就好像一个 Excel 表单一样,每个表格会有若干列,比如一个学生信息表,可能包含学号、姓名、性别、入学年份、高考成绩、籍贯等等。而表格的每一排,则是一个个学生的具体信息。在企业级应用和前互联网时代,关系型数据库几乎是不二选择。关系型数据库的特点是有整齐划一的组织,很方便对数据进行描述、插入、搜索。
杰哥的IT之旅
2021/03/30
1.3K0
MongoDB的简单配置和基本数据操作
1.下载安装mongodb,根据您的系统选择相应的版本,链接:https://www.mongodb.com/download-center#community
德顺
2019/11/12
1.2K0
MongoDB入门(四)
将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘。
传说之下的花儿
2023/11/26
3820
MongoDB入门(四)
MongoDB profile分析慢查询
在MongoDB中,如果发生了慢查询,我们如何得到这些慢查询的语句,并优化呢?今天来看这块儿的一些心得。
AsiaYe
2021/05/10
2.3K0
[置顶] 数据库MongoDB查询语句--持续更新
链接:https://pan.baidu.com/s/1RjU1BXq2rXFG07Zaw5BHrQ 提取码:o1w5
JQ实验室
2022/01/11
3.9K0
mongodb清除连接和日志
感觉是pymongo未能完全close掉和mongodb创建的tcp连接,并且在mongo连接未自动释放前进行高频连接,导致连接数爆满造成的。
李玺
2021/11/22
1.1K0
mongodb清除连接和日志
一则小故事-和时间一起做MongoDB的朋友
有关 MongoDB 是什么,MongoDB 如何用,如何发挥最大优势的相关问题,欢迎大家交流探讨。
needrunning
2020/03/04
1.5K0
MongoDB 命令记录
多行命令 您可以输入多行javascript表达式。如果括号、大括号等没有关闭,你会看到一个新行开始的……的字符。输入表达式的其余部分。按Ctrl-C中止数据输入,如果您被卡住了。
郭顺发
2023/07/17
4160
MongoDB的设计规范
1.在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,遍历比较慢
MongoDB中文社区
2019/04/22
1.8K0
MongoDB的设计规范
相关推荐
MongoDB 中聚合统计计算 – $SUM表达式
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验