MongoDB 高级查询_aggregate聚合管道
MongoDB 聚合管道(AggregationPipeline)
使用聚合管道可以对集合中的文档进行变换和组合。实际项目应用主要是表关联查询、数据的统计。
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。下面是官网给的实例,感受一下聚合管道的用法。
第一个步时查找orders集合中status为A的数据,第二步是根据cust_id做了一个分组,第三步是将属于同一个分组中的amount进行求和后给total字段赋值

MongoDB Aggregation 管道常用的操作符与表达式
MongoDB Aggregation 管道常用的操作符
$project :增加、删除、重命名字段
$match:条件匹配。只满足条件的文档才能进入下 一阶段
$limit 限制结果的数量
$skip 跳过文档的数量
$sort 条件排序。
$group 条件组合结果 统计
$lookup 操作符 用以引入其它集合的数 据 (表关联查询)
SQL 和 NOSQL 对比:

MongoDB Aggregation 管道常用的表达式
管道操作符作为“键”,所对应的“值”叫做管道表达式。例如{$match:{status:"A"}},$match 称为管道操作符,而 status:"A"称为管道表达式, 是管道操作符的操作数(Operand)。
每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。

数据模拟
在演示每个操作符的使用之前,先要有数据,这里我们先创建一个数据库()和一个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})

$project
修改文档的结构,可以用来重命名、增加或删除文档中的字段。比如:要求查找 order 只返回文档中 trade_no 和 all_price 字段
db.order.aggregate([ {
$project: {
trade_no:1,
all_price:1
}
} ])

$match
作用:用于过滤文档。用法类似于 find() 方法中的参数。比如下面找出all_price字段的值大于等于90的数据
db.order.aggregate([
{
$project:{ order_id:1,trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
}
])

$group
将集合中的文档进行分组,可用于统计结果。比如:统计每个订单的订单数量,按照订单号分组
db.order_item.aggregate(
[
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
]
)
查询结果显示order_id为3的总数total有6个.......

$sort
将集合中的文档进行排序
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":1}
}
])

$limit 限制结果的数量
这个操作符在实际项目中可以用于分页操作中查找多少条数据可以结合$skip来完成分页功能
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":-1}
},
{
$limit:1
}
])

$skip 跳过文档的数量
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":-1}
},
{
$skip:1
}
])

$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"
}
}
])

跟其他操作符来一起使用,比如$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聚合管道的更多相关文章
- mongoDB高级查询$type4array使用解析
今天在使用mongoDB高级查询$type:符号 -- 4代指Array类型发现一个问题. $type符号: $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. 下面是mong ...
- mongoDB 高级查询语法
http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Ad ...
- MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate
一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...
- Mongodb高级查询【二】
上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询. Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个.当然有很多查询跟关系型查询无法相比. ...
- MongoDB高级查询用法大全
转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...
- MongoDB高级查询详细
前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前 ...
- mongodb高级查询
前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前奏:启 ...
- MongoDB分组查询,聚合查询,以及复杂查询
准备数据 from pymongo import MongoClient import datetime client=MongoClient('mongodb://localhost:27017') ...
- mongoDB 高级查询之取模查询$mod
http://hancang2000.i.sohu.com/blog/view/235140698.htm $mod取模运算 查询age取模10等于0的数据 db.student.find( { ...
随机推荐
- kali之HexorBase数据库破解
HexorBase 用户名密码连接数据库 暴力破解 点击底栏 Bruteforces Databases Servers , 然后会弹出一个新界面 Databases Bruteforces 新界面 ...
- 重要知识点angularjs $http.get 和 $http.post 传递参数(!!!格式不一样!!!!)
$http.get请求数据的格式 $http.get(URL,{ params: { "id":id } }) .success(function(response, status ...
- 自定义指令 VUE基础回顾7
vue除了有v-if等内置指令,我们也可以创建自定义指令. 例:我们可以实现一个可以每隔一秒闪烁的节点,类似于<blink>标签的行为.添加一个指令类似于添加一个过滤器,可以将他传入vue ...
- WAS更新web.xml配置文件不生效的问题
问题及原因分析: 之前修复漏洞时,写了个过滤器配置在web.xml中,但是部署到服务器并重启后,重新扫描漏洞,还是没有解决对应问题.在确定了这种修复方案是切实可行之后分析,可能是配置的web.xml未 ...
- 基于Text-CNN模型的中文文本分类实战
Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...
- RabbitMq 消息队列 在Python端的应用
https://www.cnblogs.com/Xuuuuuu/p/10895552.html rabbit_server持久化,消费者端手动确认保证消息不会丢失.具体代码如下: 1对1生产者端代码: ...
- Upgrade Windows Server 2016 to Windows Server 2019
Pre-Upgrade Upgrade path: Windows Server 2016 can be upgraded to Windows 2019 in a single upgrade pr ...
- GNS3、Wireshark、SecureCRT 环境部署
本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...
- JAVA 容器配置 JVM 监控
目前世面上较流行的JAVA容器工具有:tomcat,jboss,weblogic 在日常工作中,经常会遇到开发需要查看JVM相关信息,这时就需要开启JVM. 一.tomcat 1 修改jdk认证配置文 ...
- python中str和byte的相互转化
在涉及到网络传输的时候,数据需要从str转换成btye才能进行传输. python byte 转 str , str 转 byte 其实很简单:原理图如下:在这里插入图片描述案例: a: str = ...