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 欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...
随机推荐
- js中的函数编程
之前在网上看到了一篇教你如何用js写出装逼的代码. 经过学些以及扩展很有收获在这里记录一下. 原文章找不到了.所以就不在这附上链接了. 大家看下下面两段js代码. 上面两端代码效果是一模一样的,都是在 ...
- 4.03 使用NULL代替默认值
问题:在一个定义了默认值的列插入数据,并且需要不管该列的默认值是什么,都将该列值设为NULL.考虑一下下面的表: create table D (id interger default 0, foo ...
- VC++绘制金刚石(MFC)
void CTxx1View::OnDraw(CDC* pDC){ CTxx1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add d ...
- windows快捷键cmd中
windows 中cmd中命令: cls ---------> 清屏 dir ----------> 获取目录 Ctrl + c ----> 结束当前命令 cd .. ------ ...
- JS concat() 方法
[数组元素的合并] 一. concat() 方法 concat() 方法用于连接两个或多个数组. 返回一个新的数组.该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的.如果 ...
- Linux之 if命令——简单的shell文件
如何写一个shell文件,写一个小脚本 1.新建一个脚本文件:vi demo.sh 2.追加执行权限: chmod u+x demo.sh 3.执行脚本:./demo.sh 4.什么是脚本?把一堆命令 ...
- nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token
nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token 注意: proxy_pass http://192.168.40.54:22 ...
- linux 隐藏进程
1.首先推荐一个后门程序https://github.com/f0rb1dd3n/Reptile 具体可以了解一下功能非常强大. 2.源码如下 root@ubuntu:/var/srt/libproc ...
- 公共dao的抽取
package cn.sxx.dao; import java.util.List; import cn.sxx.model.Dep; import cn.sxx.query.DepQuery; pu ...
- 2018 CCPC 女生赛 hdoj6288 缺失的数据范围
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6288 Summarize:1.二分查找答案: 2.自带log函数精度不够,需自己写: 3.注意二分递归 ...