ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB 聚合管道(Aggregation Pipeline)

2022-03-02 10:32:22  阅读:212  来源: 互联网

标签:Pipeline no MongoDB price Aggregation order num trade id


MongoDB 聚合管道(Aggregation Pipeline)
使用聚合管道可以对集合中的文档进行 变换 和 组合

实际项目中用途:表关联查询,数据的统计

常用的管道操作符

管道操作                 描述(description)
1.$project           增加,删除,重命名字段
2.$match            条件匹配,只满足条件的文档才能进入下一阶段
3.$limit                限制结果数量(用于基础查询的分页)
4.$skip                跳过文档数量(用于基础查询的分页)
5.$sort                条件排序       (用于基础查询的排序)
6.$group             条件组合结果
7.$lookup            $lookup操作符,用以引入其它集合的数据

1.$project
db.order.aggregate(
[
{
$project:{order_id:1,trade_no:1,all_price:1}
}
]
)
结果 指定字段
{
{"order_id":"1","trade_no":"111","all_price":100},
{"order_id":"1","trade_no":"111","all_price":100},
{"order_id":"1","trade_no":"111","all_price":100}
}
2.$match
db.order.aggregate(
[
{
$project:{trade_no:1,all_price:1}
},
{
$match:{"all_price":{$gte:90}}
}
]
)
结果是 满足条件的指定数据
{
{"trade_no":"111","all_price":100},
{"trade_no":"222","all_price":90}
}

6.$group
db.order_item.aggregate(
[
{
$group:{_id:"$order_id",total:{$sum:"$num"}}
}
]
)
结果是 统计数据

7.$lookup 关联查询
需求:实现下面结果
[
{
Order_id:'1',
Trade_no:' ',
Items:[
{
Title:'鼠标',
Price:20
},
{
Title:'键盘',
Price:20
}
]
},
{
Order_id:'2',
Trade_no:' ',
Items:[
{
Title:'鼠标',
Price:20
},
{
Title:'键盘',
Price:20
}
]
}
]
操作(固定写法
db.order.aggregate([
{
$lookup:
{
from:"order_item", // 关联表
localField:"order_id", // 关联字段 主表(order)关联字段
foreignField:"order_id", // 关联字段 子表(order_item)关联字段
as:"items"
}
}
])
db.order.aggregate([
{
$lookup:
{
from:"order_item",
localField:"order_id",
foreignField:"order_id",
as:"items"
}
},
{
$project:{trade_no:1,all_price:1,all_num:1,items:1} //**** items:1 必须写,不然查出来的关联集合items就丢失了
}
])
结果
{
"_id" : ObjectId("62148fa2393abd107e0ae77e"),
"order_id" : "1",
"uid" : 10,
"trade_no" : "111",
"all_price" : 100,
"all_num" : 2,
"items" : [
{ "_id" : ObjectId("62148fc2393abd107e0ae781"), "order_id" : "1", "title" : "商品鼠标1", "price" : 50, "num" : 1 },
{ "_id" : ObjectId("62148fc8393abd107e0ae782"), "order_id" : "1", "title" : "商品键盘2", "price" : 50, "num" : 1 }
]
}
{
"_id" : ObjectId("62148fad393abd107e0ae77f"),
"order_id" : "2",
"uid" : 7,
"trade_no" : "222",
"all_price" : 90,
"all_num" : 2,
"items" : [
{ "_id" : ObjectId("62148fcd393abd107e0ae783"), "order_id" : "2", "title" : "牛奶", "price" : 50, "num" : 1 },
{ "_id" : ObjectId("62148fd4393abd107e0ae784"), "order_id" : "2", "title" : "酸奶", "price" : 40, "num" : 1 }
]
}
{
"_id" : ObjectId("62148fb5393abd107e0ae780"),
"order_id" : "3",
"uid" : 9,
"trade_no" : "333",
"all_price" : 20,
"all_num" : 6,
"items" : [
{ "_id" : ObjectId("6214905e393abd107e0ae785"), "order_id" : "3", "title" : "矿泉水", "price" : 2, "num" : 5 },
{ "_id" : ObjectId("62149072393abd107e0ae786"), "order_id" : "3", "title" : "毛巾", "price" : 10, "num" : 1 }
]
}
db.order.aggregate([
{
$lookup:
{
from:"order_item",
localField:"order_id",
foreignField:"order_id",
as:"items"
}
},
{
$match:{"all_price":{$gte:90}}
}
])
结果
{
"_id" : ObjectId("62148fa2393abd107e0ae77e"),
"order_id" : "1",
"uid" : 10,
"trade_no" : "111",
"all_price" : 100,
"all_num" : 2,
"items" : [
{ "_id" : ObjectId("62148fc2393abd107e0ae781"), "order_id" : "1", "title" : "商品鼠标1", "price" : 50, "num" : 1 },
{ "_id" : ObjectId("62148fc8393abd107e0ae782"), "order_id" : "1", "title" : "商品键盘2", "price" : 50, "num" : 1 }
]
}
{
"_id" : ObjectId("62148fad393abd107e0ae77f"),
"order_id" : "2",
"uid" : 7,
"trade_no" : "222",
"all_price" : 90,
"all_num" : 2,
"items" : [
{ "_id" : ObjectId("62148fcd393abd107e0ae783"), "order_id" : "2", "title" : "牛奶", "price" : 50, "num" : 1 },
{ "_id" : ObjectId("62148fd4393abd107e0ae784"), "order_id" : "2", "title" : "酸奶", "price" : 40, "num" : 1 }
]
}
以下是为了上面的操作插入的 order表与order_item表的数据:
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":"2","title":"牛奶","price":50,"num":1})
db.order_item.insert({"order_id":"2","title":"酸奶","price":40,"num":1})

db.order_item.insert({"order_id":"2","title":"矿泉水","price":2,"num":5})
db.order_item.insert({"order_id":"2","title":"毛巾","price":10,"num":1})

标签:Pipeline,no,MongoDB,price,Aggregation,order,num,trade,id
来源: https://www.cnblogs.com/shuleiCheck/p/15953896.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有