首页 > 其他分享 >聚合查询

聚合查询

时间:2023-11-10 10:01:54浏览次数:34  
标签:聚合 name db NumberDecimal 查询 score group qty

聚合框架

MongoDB的聚合框架,可以处理进行类似于SQL的group,left outer join之类的运算,只不过可以来控制执行的顺序。
适应的范围目前看优势还是在分析(OLAP),当然OLTP也支持

基本格式

常规的用法是生成一个数组(Pipeline),然后在Pipeline里写处理的步骤(Stage),最后在表(Collection)上调用arrgegate来进行运算。

## 这个是伪代码
pipeline = [$stage1, $stage2, ... $stageN];
db.<COLLECTION>.aggregate(
    pipline,
    { options }
);

与MySQL的对比

与SQL运算符的比较

步骤作用SQL
$match 过滤 where
$project 投影 as
$sort 排序 order by
$group 分组 group by
$skip/$limit 结果限制 skip/limit
$lookup 左外连接 left outer join

步骤中运算符

$match,过滤

$eq/$gt/$lt/$gte/$lte
$and/$or/$not/$in
$geoWithin/$intersect


$project,选择字段

$map/$reduce/$filter
$range
$multiply/$divide/$substract/$add
$year/$month/$dayOfMonth/$hour/$minute/$second


$group,分组

$sum/$avg
$push/$addToSet
$first/$last/$max/$min


特有的步骤,SQL里没有对应的

步骤作用
$unwind 展开数组
$graphLookup 图搜索
$facet/$bucket 分面搜索

例子1

SQL

SELECT
  first_name as '名',
  last_name as '姓'
FROM users
WHERE gender = '男'
SKIP 100
LIMIT 20

MQL

db.users.aggregate([
  { $match: { gender: '男' } },
  { $skip: 100 },
  { $limit: 20 },
  { $project: 
    {
      '名': '$first_name',
      '姓': '$last_name'
    }
  }
]);

例子2

SQL

select
  department,
  count(null) as emp_qty
from
  users
where
  gender = '女'
group by
  department
having
  count(*) < 10

MQL

db.users.aggregate([
  { $match: { 'gender' : '女' }},
  { $group: {
      _id: '$department'
      emp_qty: { $sum: 1 }
  }},
  { $match: { emp_qty: { $lt: 10 }}}
])

例子3 $unwind

说白了就是将文档的树型结构展开成行的结构

文档
> db.students.findOne()
{
  name: '张三',
  score: [
    { subject: '语文', score: 84 },
    { subject: '数学', score: 90 },
    { subject: '外语', score: 69 }
  ]
}
展开成行
db.students.aggregate([$unwind: '$score'}])
{ name: '张三', score: {subject: '语文', score: 84 }}
{ name: '张三', score: {subject: '数学', score: 90 }}
{ name: '张三', score: {subject: '外语', score: 69 }}

$bucket,就是针对一个数据,按区间来统计

image.png

db.products.aggregate([{
  $bucket: {
    groupBy: '$price',
    boundaries: [0, 10, 20, 30, 40],
    default: 'Other',
    output: { 'count': { $sum: 1 }}
  }
}])

$facet,还是按区间统计,但可针对多个数据分别统计

image.png

 
db.products.aggregate([{
  $facet: {
    price: {
      $bucket: {...}
    },
    year: {
      $bucket: {...}
    }
  }
}])




使用的表

> db.orders.findOne()
{
    "_id" : ObjectId("5dbe7a545368f69de2b4d36e"),
    "street" : "493 Hilll Curve",
    "city" : "Champlinberg",
    "state" : "Texas",
    "country" : "Malaysia",
    "zip" : "24344-1715",
    "phone" : "425.956.7743 x4621",
    "name" : "Destinee Schneider",
    "userId" : 3573,
    "orderDate" : ISODate("2019-03-26T03:20:08.805Z"),
    "status" : "created",
    "shippingFee" : NumberDecimal("8.00"),
    "orderLines" : [
        {
            "product" : "Refined Fresh Tuna",
            "sku" : "2057",
            "qty" : 25,
            "price" : NumberDecimal("56.00"),
            "cost" : NumberDecimal("46.48")
        },
        {
            "product" : "Refined Concrete Ball",
            "sku" : "1738",
            "qty" : 61,
            "price" : NumberDecimal("47.00"),
            "cost" : NumberDecimal("47")
        },
        {
            "product" : "Rustic Granite Towels",
            "sku" : "500",
            "qty" : 62,
            "price" : NumberDecimal("74.00"),
            "cost" : NumberDecimal("62.16")
        },
        {
            "product" : "Refined Rubber Salad",
            "sku" : "1400",
            "qty" : 73,
            "price" : NumberDecimal("93.00"),
            "cost" : NumberDecimal("87.42")
        },
        {
            "product" : "Intelligent Wooden Towels",
            "sku" : "5674",
            "qty" : 72,
            "price" : NumberDecimal("84.00"),
            "cost" : NumberDecimal("68.88")
        },
        {
            "product" : "Refined Steel Bacon",
            "sku" : "5009",
            "qty" : 8,
            "price" : NumberDecimal("53.00"),
            "cost" : NumberDecimal("50.35")
        }
    ],
    "total" : NumberDecimal("407")
}

计算所有订单的总销售额

> db.orders.aggregate([{
$group:
  {
    _id: null,
    total: { $sum: "$total"}
  }
}])
{ "_id" : null, "total" : NumberDecimal("44019609") }
>

查询2019年第一季度(1月1日~3月31日)已完成订单(completed)的订单总金额和订单总数

 
>db.orders.aggregate(
[{$match: {
  status: "completed",
  orderDate: {
    $gte: ISODate('2019-01-01'),
    $lt: ISODate('2019-04-01')
  }
}}, {$group: {
  _id: null,
  total: {
    $sum: "$total"
  },
  shippingFee: {
    $sum: "$shippingFee"
  },
  count: {
    $sum: 1
  }
}}, {$project: {
  grandTotal: {
    $add: ["$total", "$shippingFee"]
  },
  count: 1,
    _id: 0
}}]
)

{ "count" : 5875, "grandTotal" : NumberDecimal("2636376.00") }






标签:聚合,name,db,NumberDecimal,查询,score,group,qty
From: https://www.cnblogs.com/lovezhr/p/17823449.html

相关文章

  • 简单查询
    计划今天要学习《06MongoDB基本操作》Mongo的连接地址格式mongodb://username:password@host[:port]/database?<options>基本操作以下都在shell环境下查看当前数据库>dbmock切换数据库>usetest查看当前表>showcollections>showtables插入一条记录>db.frui......
  • maven项目聚合和父子项目
    maven项目聚合聚合项目又称为多模块项目,这种结构的目的是为了统一构建项目,也就是说当对根项目的任何mvn命令操作,都会相应的执行到每一个被聚合的module项目中,目的是为了方便管理多个项目的编译打包等操作。想象一下,如果你创建了10个项目,如果你要对这10个项目进行mvninstall操......
  • 推荐我最喜爱的聚合类应用——太极神器
    今天给大家分享一款好用好玩的软件。如果你的日常工作娱乐,常常用到不同类型的软件,每个都要安装一边又占内存,那么强烈推荐你使用聚合类工具箱,软件体积不大,但功能多样,日用非常方便。最近,该软件进行了全新升级,功能更强更稳定,轻度用户使用基本功能就已经足够了,壕无人性的同学则可以考虑......
  • 高斯数据库HCNA之数据查询
    一、数据查询1、简单查询日常查询中,最常用的是通过FROM子句实现的查询语法格式使用方法:SELECT[,...]FROMtable_reference[,...]SELECT关键字之后和FROM子句之前出现的表达式称为SELECT项,SELECT项用于指定要查询的列,FROM指定要从哪个表中查询如果要查询所有列,可以在SE......
  • MySQL千万级数据库查询怎么提高查询效率
     查询效率慢的原因: 1:没有加索引或者索引失效  where条件使用如下语句会索引失效:null、!=、<>、or连接、in(非要使用,可用关键字exist替代)和notin、'%abc%';  使用参数:num=@num、表达式操作:wherenum/2=100、函数操作:wheresubstring(name,1,3)=‘abc’-name;   --e......
  • mybatis使用id集合查询数据
    dao层intdelUser(@Param("menuId")IntegermenuId,@Param("idList")List<String>idList);xml层<deleteid="delUser">deleteFROMuser_role_menuWHEREmenu_id=#{menuId}ANDuser_idNOTIN<f......
  • 从 SQL 查询优化技巧去看 h2 数据库查询原理 | 京东物流技术团队
    本文目标是:了解查询的核心原理,对比SQL查询优化技巧在h2database中的落地实现。前提:为了贴近实际应用,本文CodeInsight基于BTree存储引擎。数据查询核心原理数据库实现查询的原理:遍历表/索引,判断是否满足where筛选条件,添加到结果集。简单通用。对于选择表还是索引、如何遍历......
  • orcale中把查询结果是逗号多个人员的数据转换为单行,过滤重复的
    1.原本图 2.解决方法selectregexp_substr(a.numbers,'[^,]+',1,level)asnumbersfrom(selectdistinctid,numbersfromprojectwhereisdelete=0andisactive=1andnvl(objstatus,'402881e50c717307010c719745ce0009')!='402881e50c717307010c......
  • mysql 优化之开启慢查询并分析原因
      第一步.开启mysql慢查询方式一:修改配置文件my.ini增加几行:slow_query_log=on#开启慢查询日志slow_query_log_file=filename#指定日志文件保存路径,不指定的话默认在数据库文件目录下,名为hostname-slow.loglong_query_time=2#指定达到多少秒才算慢查询long-que......
  • elasticsearch在Java中查询指定列的方法
     背景ES在查询时如果数量太多,而每行记录包含的字段很多,那就会导致超出ES的查询上线,默认是100MB,但是很多场景下我们只需要返回特定的字段即可,那么如何操作呢。主要代码@AutowiredprivateRestHighLevelClientclient;publicList<Map<String,Object>>search(Stringin......