MongoDB 高级查询_aggregate聚合管道

摘要:
使用数据库。MongoDB中的集合_名称。用于生成和使用聚合管道的聚合方法。第一步是在订单集中查找状态为A的数据。第二步是根据cust_ ID分组查找状态为A的数据。第三步是将属于同一组的金额相加,并将total字段的值分配给MongoDB聚合管道常用的运算符和MongoDB聚合管线$project常用的表达式:add、delete、,和重命名字段$match:match conditions$组条件组合结果统计$lookup运算符用于引入其他集合的数据SQL和NOSQL比较:MongoDB聚合管道常用的表达式管道运算符用作“键”,对应的“值”称为管道表达式。

MongoDB 聚合管道(AggregationPipeline)

使用聚合管道可以对集合中的文档进行变换和组合。实际项目应用主要是表关联查询、数据的统计。

MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。下面是官网给的实例,感受一下聚合管道的用法。

第一个步时查找orders集合中status为A的数据,第二步是根据cust_id做了一个分组,第三步是将属于同一个分组中的amount进行求和后给total字段赋值

MongoDB 高级查询_aggregate聚合管道第1张

MongoDB Aggregation 管道常用的操作符与表达式

MongoDB Aggregation 管道常用的操作符

$project :增加、删除、重命名字段

$match:条件匹配。只满足条件的文档才能进入下 一阶段

$limit 限制结果的数量

$skip 跳过文档的数量

$sort 条件排序。

$group 条件组合结果 统计

$lookup 操作符 用以引入其它集合的数 据 (表关联查询)

SQL 和 NOSQL 对比:

MongoDB 高级查询_aggregate聚合管道第2张

MongoDB Aggregation 管道常用的表达式

管道操作符作为“键”,所对应的“值”叫做管道表达式。例如{$match:{status:"A"}},$match 称为管道操作符,而 status:"A"称为管道表达式, 是管道操作符的操作数(Operand)。

每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。

MongoDB 高级查询_aggregate聚合管道第3张

数据模拟

在演示每个操作符的使用之前,先要有数据,这里我们先创建一个数据库()和一个order集合,order_item集合来进行演示操作

先使用数据库aggregation(使用及创建)

use aggregation

然后直接插入数据的方式来创建集合

db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) 
db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) 
db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6})


db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) 
db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) 
db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1})
db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) 
db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1})
db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) 
db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})

MongoDB 高级查询_aggregate聚合管道第4张

$project

修改文档的结构,可以用来重命名、增加或删除文档中的字段。比如:要求查找 order 只返回文档中 trade_no 和 all_price 字段

db.order.aggregate([ {
  $project: {
    trade_no:1,
    all_price:1
  }
} ])

MongoDB 高级查询_aggregate聚合管道第5张

$match

作用:用于过滤文档。用法类似于 find() 方法中的参数。比如下面找出all_price字段的值大于等于90的数据

db.order.aggregate([
  {
    $project:{ order_id:1,trade_no:1, all_price:1 }
  },
  {
    $match:{"all_price":{$gte:90}}
  }
])

MongoDB 高级查询_aggregate聚合管道第6张

$group

将集合中的文档进行分组,可用于统计结果。比如:统计每个订单的订单数量,按照订单号分组

db.order_item.aggregate(
  [
    {
      $group: {_id: "$order_id", total: {$sum: "$num"}}
    }
  ]
)

查询结果显示order_id为3的总数total有6个.......

MongoDB 高级查询_aggregate聚合管道第7张

$sort

将集合中的文档进行排序

db.order.aggregate([
  {
    $project:{ trade_no:1, all_price:1 }
  },
  {
    $match:{"all_price":{$gte:90}}
  },
  {
    $sort:{"all_price":1}
  }
])

MongoDB 高级查询_aggregate聚合管道第8张

$limit 限制结果的数量

这个操作符在实际项目中可以用于分页操作中查找多少条数据可以结合$skip来完成分页功能

db.order.aggregate([
  {
    $project:{ trade_no:1, all_price:1 }
  },
  {
    $match:{"all_price":{$gte:90}}
  },
  {
    $sort:{"all_price":-1}
  },
  {
    $limit:1
  }
])

MongoDB 高级查询_aggregate聚合管道第9张

$skip 跳过文档的数量

db.order.aggregate([
  {
    $project:{ trade_no:1, all_price:1 }
  },
  {
    $match:{"all_price":{$gte:90}}
  },
  {
    $sort:{"all_price":-1}
  },
  {
    $skip:1
  }
])

MongoDB 高级查询_aggregate聚合管道第10张

$lookup 表关联

比如我想查找order集合和order_item集合,然后得出下面这样的结果

[{
  Order_id:'1',
  Trade_no:'',
  Items:[{
    Title:'鼠标',
    Price: 20
  }, {
    Title: '键盘',
    Price: 20
  }]
}, {
  Order_id: '2',
  Trade_no: '',
  Items: [{
    Title: '鼠标',
    Price: 20
  }, {
    Title: '键盘',
    Price: 20
  }]
}]

那么我们可以使用$lookup关联查询

db.order.aggregate([
  {
    $lookup:
      {
        from: "order_item",
        localField: "order_id",
        foreignField: "order_id",
        as: "items"
      }
  }
])

MongoDB 高级查询_aggregate聚合管道第11张

跟其他操作符来一起使用,比如$match,找出all_price字段大于等于90的数据

db.order.aggregate([
  {
    $lookup:
      {
        from: "order_item",
        localField: "order_id",
        foreignField: "order_id",
        as: "items"
      }
  },
  {
    $match:{"all_price":{$gte:90}}
  }
])

MongoDB 高级查询_aggregate聚合管道第12张

免责声明:文章转载自《MongoDB 高级查询_aggregate聚合管道》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】收集 jetty、tomcat、jboss、weblogic 的比较如何查看手机电量消耗是否正常?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多种方式实现字符串/无符号数反向输出_栈_递归_头尾指针

1、递归调用方式实现无符号数反向输出 C语言实现(DEV c++4.9.9.2运行通过) #include<stdio.h> void reverse_print(unsigned long num) { if(num==0) return; printf("%d",num%10); //输出最低位...

动手学深度学习13-权重衰减

权重衰减 高维线性回归实验 从零开始实现 初始化模型参数 定义L2范数惩罚项 定义训练和测试 使用权重衰减 pytorch简洁实现 小结 上一节中提提到的过拟合现象,在模型的训练误差远小于测试集上的误差。虽然增大训练接数据集可以减轻过拟合,但是获得额外的训练数据往往代价过大,本节介绍过拟合常用的方式:权重衰减(weight decay)。 权重衰...

spring boot 集成mongodb

一、相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId&...

Android如何制作漂亮的自适布局的键盘

  最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路。   这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的数字键盘,高度和宽度需要自适应。先来张效果图:   最常见的解决方案是用线性布局,自适应当然是按比例,但布...

设计统计英文字母出现频率的程序的感想

  今天下午我们在学习Java的过程中,王老师给我们留下了一个程序设计作业,其要求是让我们设计一个程序,要实现 输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中的功能。我思考并上机了一个下午最终实现了部分功能。   首先当看到这个题目的时候,我想到了将这个实验分成三部分:   1.读取指定文本的内容;   2.统计所有单词在该文本中的...

mongodb的备份还原

一:备份数据库 G:Program FilesMongoDBServer3.0in>mongodump -d mydb -o g:/data/back mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果没有用户,可以去掉-u和-p。如果导出本机的数据库,可以去掉-h。如果是默认端口,可...