MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate
一、MongoDB聚合管道(Aggregation Pilpeline)
使用聚合管道可以对集合中的文档进行变换和组合。
主要功能:表的关联查询、数据统计

二、aggregate 管道操作符与表达式
管道操作符:

sql 和 nosql 对比:

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

三、数据模拟:
db.order.insert({"order_id":"","uid":,"trade_no":"","all_price":,"all_num":})
db.order.insert({"order_id":"","uid":,"trade_no":"","all_price":,"all_num":})
db.order.insert({"order_id":"","uid":,"trade_no":"","all_price":,"all_num":})
db.order_item.insert({"order_id":"","title":"商品鼠标 1","price":,num:})
db.order_item.insert({"order_id":"","title":"商品键盘 2","price":,num:})
db.order_item.insert({"order_id":"","title":"商品键盘 3","price":,num:})
db.order_item.insert({"order_id":"","title":"牛奶","price":,num:})
db.order_item.insert({"order_id":"","title":"酸奶","price":,num:})
db.order_item.insert({"order_id":"","title":"矿泉水","price":,num:})
db.order_item.insert({"order_id":"","title":"毛巾","price":,num:})
四、$project
修改文档的结构,可以用来重命名、增加或者删除文档中的字段
例如:要求查找order只返回trade_no和all_price字段
db.order.aggregate([
{
$project:{ trade_no:, all_price: }
}
])
五、$match
用于过滤文档。类似where
db.order.aggregate([
{
$project:{ trade_no:, all_price: }
},
{
$match:{"all_price":{$gte:}}
}
])
六、$group
分组
统计每个订单的订单数量, 按照订单号分组
db.order_item.aggregate(
[
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
]
七、$sort
排序
-1:降序;1:升序
db.order.aggregate([
{
$project:{ trade_no:, all_price: }
},
{
$match:{"all_price":{$gte:}}
},
{
$sort:{"all_price":-}
}
])
八、$limit
查询前几条
db.order.aggregate([
{
$project:{ trade_no:, all_price: }
},
{
$match:{"all_price":{$gte:}}
},
{
$sort:{"all_price":-}
},
{
$limit:
}
])
九、$skip
跳过几条
db.order.aggregate([
{
$project:{ trade_no:, all_price: }
},
{
$match:{"all_price":{$gte:}}
},
{
$sort:{"all_price":-}
},{
$skip:
}
])
十、$lookup
表关联查询
db.order.aggregate([
{
$lookup:
{
from: "order_item", //关联表
localField: "order_id", //主表的字段
foreignField: "order_id", //关联表的字段
as: "items" //存储的字段
}
}
])
当然也可以使用其他操作符
db.order.aggregate([
{
$lookup:{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
},
{
$match:{"all_price":{$gte:}}
}
])
db.order.aggregate([
{
$lookup:
{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
},
{
$project:{ trade_no:, all_price:,items: }
},
{
$match:{"all_price":{$gte:}}
},
{
$sort:{"all_price":-}
},
])
十一、nodejs操作aggregate聚合管道
var MongoClient = require('mongodb').MongoClient;
//定义连接数据库的地址
const url = 'mongodb://localhost:27017/';
var dbName = 'eggcms';
//连接数据库
MongoClient.connect(url,(err,client)=>{
if(err){
console.log('数据连接失败');
return false;
}
let db=client.db(dbName); /*获取db对象*/
db.collection("order").aggregate([
{
$lookup:
{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
},
{
$match:{"all_price":{$gte:90}}
}
]).toArray(function(err,docs){
console.log(docs)
})
})
MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate的更多相关文章
- MongoDB 高级查询_aggregate聚合管道
MongoDB 聚合管道(AggregationPipeline) 使用聚合管道可以对集合中的文档进行变换和组合.实际项目应用主要是表关联查询.数据的统计. MongoDB 中使用 db.COLLEC ...
- MongoDB学习笔记六—查询下
查询内嵌文档 数据准备 > db.blog.find().pretty() { "_id" : ObjectId("585694e4c5b0525a48a441b5 ...
- MongoDB学习(查找文档和其他数据查找操作)
理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...
- Mongodb - 解决 ( aggregate聚合管道 ) $match 根据 id 匹配 返回 [ ] 的问题
需要对 id 进行转换 const mongoose = require('mongoose') var ObjectId = mongoose.Types.ObjectId; await Use ...
- MongoDB学习(使用分组、聚合和映射-归并)
使用分组.聚合和映射-归并 MongoDB的强大功能之一,是直接在服务器对文档的值进行复杂的操作,而不用先发文档发送到客户端在进行处理. 结果分组 对大型数据集进行查询操作时,通常会根据文档的字段值对 ...
- MongoDB学习笔记(11) --- 聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) aggregate() 方法 MongoDB中聚 ...
- MongoDB学习笔记五—查询上
数据准备 { , "goods_name" : "KD876", "createTime" : ISODate("2016-12- ...
- MongoDB中的高级查询(二)
$mod取模运算 查询index对5取模运算等于1的数据. $not $not是元条件句,即可以用在任何其他条件之上.查询index对5取模运算不等于1的数据. $exists判断字段是否存在 查询出 ...
- MongoDB学习 (六):查询
本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html 欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...
随机推荐
- 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 这个教程的前两篇文章,介绍了如何 ...
- powerDesigner 把name项添加到注释(comment),完美方案!
第一次写博客,分享一点经验吧,平时大家用powerDesigner的时候,pd是不会把name项默认添加到comment的,所以生成的数据库表里面也没有中文字段的注释. 我在网上查了一下.有解决方案了 ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
- Python list 增加/插入元素的说明
http://blog.csdn.net/cnmilan/article/details/9259343 在Python中append 用来向 list 的末尾追加单个元素,如果增加的元素是一个lis ...
- 1.入手树莓派之linux环境搭建
最近刚刚买了一款 树莓派3代B型 raspberrypi 板载蓝牙和WIFI 英国版本,没玩过,觉得很好奇,生怕记性不好哈,把自己玩的过程记录一下,以备不时之需: 需要材料: 1) 树莓派: 2)sd ...
- OpenCV2:第六章 图像几何变换
一.简介 图像的几何变换有距离变换 坐标映射 平移 镜像 旋转 缩放 仿射变换等 二.重映射 把一张图像重新排列像素,比如倒置 CV_EXPORTS_W void remap( InputArr ...
- Oracle清空数据库中数据表数据的方法
一.简介最近在项目发版测试的时候,导出dmp的时候不小心把开发库中的一些脏数据导出来了,测试那边导入进去之后一堆不规范的数据,为了不影响测试结果,于是总结了一个快速清空数据库数据表所有数据的方法. 二 ...
- 【转】NIO的定义和原理是什么?
NIO和IO到底有什么区别?有什么关系? 首先说一下核心区别: NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的.所以在效率上的话,肯定是NIO效率比IO效率会高出很多. N ...
- MariaDB数据库(一)
1.数据库简介 1.1 什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方 ...
- webpack 之 缓存处理
针对 这里 的所提到的观点,如果webpack每次都生成相同名字的bundle.js,会导致问题.这里使用webpack的文件hash功能来解决,简简单单地为输出文件添加一个“[hash]”即可. / ...