MongoDB的高级查询 、MongoDB多表关联查询、aggregate聚合管道
一、关系型数据库表(集合)与表(集合)之 间的几种关系
1、一对一的关系
例如:一个人对应一个唯一的身份证号,即为一对一的关系。
2、一对多的关系
例如:一个班级对应多名学生,一个学生只能属于一个班级,即为一对多关系
3、多对多的关系
例如:一个学生可以选多门课程,而同一门课程可以被多个学生选修,彼此的对应关系 即是多对多关系
二、MongoDB 聚合管道(Aggregation Pipeline)
使用聚合管道可以对集合中的文档进行变换和组合。
实际项目:表关联查询、数据的统计
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},…]) 方法 来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。
三、MongoDB Aggregation 管道操作符与表达式
四、 $project
修改文档的结构,可以用来重命名、增加或删除文档中的字段。 要求查找 order 只返回文档中 trade_no 和 all_price 字段
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
}
])
五、 $match
作用 用于过滤文档。用法类似于 find() 方法中的参数。
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{all_price:{$gte:90}}
}
])
六、 $group
将集合中的文档进行分组,可用于统计结果。 统计每个订单的订单数量,按照订单号分组
db.order_item.aggregate([
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
])
七、 $sort
将集合中的文档进行排序。
db.order.aggregate([
{
$project:{ trade_no:1, all_price:1 }
},
{
$match:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":-1}
}
])
八、 $limit
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 表关联
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
}
])
结果
{
"_id": ObjectId("620268eeec03ddfd5f5c6a7a"),
"order_id": "1",
"uid": 10,
"trade_no": "111",
"all_price": 100,
"all_num": 2,
"items": [{
"_id": ObjectId("62026907ec03ddfd5f5c6a7d"),
"order_id": "1",
"title": "商品鼠标 1",
"price": 50,
"num": 1
}, {
"_id": ObjectId("6202690dec03ddfd5f5c6a7e"),
"order_id": "1",
"title": "商品键盘 2",
"price": 50,
"num": 1
}, {
"_id": ObjectId("62026912ec03ddfd5f5c6a7f"),
"order_id": "1",
"title": "商品键盘 3",
"price": 0,
"num": 1
}]
} {
"_id": ObjectId("620268f4ec03ddfd5f5c6a7b"),
"order_id": "2",
"uid": 7,
"trade_no": "222",
"all_price": 90,
"all_num": 2,
"items": [{
"_id": ObjectId("62026918ec03ddfd5f5c6a80"),
"order_id": "2",
"title": "牛奶",
"price": 50,
"num": 1
}, {
"_id": ObjectId("6202691dec03ddfd5f5c6a81"),
"order_id": "2",
"title": "酸奶",
"price": 40,
"num": 1
}]
} {
"_id": ObjectId("620268fbec03ddfd5f5c6a7c"),
"order_id": "3",
"uid": 9,
"trade_no": "333",
"all_price": 20,
"all_num": 6,
"items": [{
"_id": ObjectId("62026926ec03ddfd5f5c6a82"),
"order_id": "3",
"title": "矿泉水",
"price": 2,
"num": 5
}, {
"_id": ObjectId("6202692cec03ddfd5f5c6a83"),
"order_id": "3",
"title": "毛巾",
"price": 10,
"num": 1
}]
}
关联查询后,找出all_peice大于90的item
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
},
{
$match:{"all_price":{$gt:90}}
}
}
])
结果
{
"_id": ObjectId("620268eeec03ddfd5f5c6a7a"),
"order_id": "1",
"uid": 10,
"trade_no": "111",
"all_price": 100,
"all_num": 2,
"items": [{
"_id": ObjectId("62026907ec03ddfd5f5c6a7d"),
"order_id": "1",
"title": "商品鼠标 1",
"price": 50,
"num": 1
}, {
"_id": ObjectId("6202690dec03ddfd5f5c6a7e"),
"order_id": "1",
"title": "商品键盘 2",
"price": 50,
"num": 1
}, {
"_id": ObjectId("62026912ec03ddfd5f5c6a7f"),
"order_id": "1",
"title": "商品键盘 3",
"price": 0,
"num": 1
}]
}
十一、导入导出
|