MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道(Aggregation Pipeline)

使用聚合管道可以对集合中的文档进行变换和组合。

实际项目:表关联查询、数据的统计。

MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。
先看下官网给的实例,感受一下聚合管道的用法。
在这里插入图片描述

二、MongoDB Aggregation 管道操作符与表达式

在这里插入图片描述
SQL 和 NOSQL 对比:
在这里插入图片描述

管道表达式: 管道操作符作为“键”,所对应的“值”叫做管道表达式。

例如{KaTeX parse error: Expected 'EOF', got '}' at position 19: …ch:{status:"A"}}̲,match 称为管道操作符,而 status:"A"称为管道表达式, 是管道操作符的操作数(Operand)。

每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。
在这里插入图片描述

三、 数据模拟

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 只返回文档中order_id, trade_no 和 all_price 字段
在这里插入图片描述

五、 $match 作用用于过滤文档。

用法类似于 find() 方法中的参数。
在这里插入图片描述

六、 $group

将集合中的文档进行分组,可用于统计结果。

统计每个订单的订单数量,按照订单号分组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、 $sort

将集合中的文档进行排序。
在这里插入图片描述

八、 $limit

在这里插入图片描述

九、 $skip

在这里插入图片描述

十、 $lookup 表关联

db.order.aggregate([{
    $lookup: {
        from: "order_item",
        localField: "order_id",
        foreignField: "order_id",
        as: "items"
    }
}])

查询结果:

// 1
{
    "_id": ObjectId("606ecfbdbb390000fa004964"),
    "order_id": "1",
    "uid": 10,
    "trade_no": "111",
    "all_price": 100,
    "all_num": 2,
    "items": [
        {
            "_id": ObjectId("606ecfbdbb390000fa004967"),
            "order_id": "1",
            "title": "商品鼠标 1",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa004968"),
            "order_id": "1",
            "title": "商品键盘 2",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa004969"),
            "order_id": "1",
            "title": "商品键盘 3",
            "price": 0,
            "num": 1
        }
    ]
}

// 2
{
    "_id": ObjectId("606ecfbdbb390000fa004965"),
    "order_id": "2",
    "uid": 7,
    "trade_no": "222",
    "all_price": 90,
    "all_num": 2,
    "items": [
        {
            "_id": ObjectId("606ecfbdbb390000fa00496a"),
            "order_id": "2",
            "title": "牛奶",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa00496b"),
            "order_id": "2",
            "title": "酸奶",
            "price": 40,
            "num": 1
        }
    ]
}

// 3
{
    "_id": ObjectId("606ecfbdbb390000fa004966"),
    "order_id": "3",
    "uid": 9,
    "trade_no": "333",
    "all_price": 20,
    "all_num": 6,
    "items": [
        {
            "_id": ObjectId("606ecfbdbb390000fa00496c"),
            "order_id": "3",
            "title": "矿泉水",
            "price": 2,
            "num": 5
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa00496d"),
            "order_id": "3",
            "title": "毛巾",
            "price": 10,
            "num": 1
        }
    ]
}
db.order.aggregate([{
    $lookup: {
        from: "order_item",
        localField: "order_id",
        foreignField: "order_id",
        as: "items"
    }
}, {
    $project: {
        trade_no: 1,
        all_price: 1,
        items: 1
    }
}, {
    $match: {
        "all_price": {
            $gte: 90
        }
    }
}, {
    $sort: {
        "all_price":  - 1
    }
}, ])

查询结果:

// 1
{
    "_id": ObjectId("606ecfbdbb390000fa004964"),
    "trade_no": "111",
    "all_price": 100,
    "items": [
        {
            "_id": ObjectId("606ecfbdbb390000fa004967"),
            "order_id": "1",
            "title": "商品鼠标 1",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa004968"),
            "order_id": "1",
            "title": "商品键盘 2",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa004969"),
            "order_id": "1",
            "title": "商品键盘 3",
            "price": 0,
            "num": 1
        }
    ]
}

// 2
{
    "_id": ObjectId("606ecfbdbb390000fa004965"),
    "trade_no": "222",
    "all_price": 90,
    "items": [
        {
            "_id": ObjectId("606ecfbdbb390000fa00496a"),
            "order_id": "2",
            "title": "牛奶",
            "price": 50,
            "num": 1
        },
        {
            "_id": ObjectId("606ecfbdbb390000fa00496b"),
            "order_id": "2",
            "title": "酸奶",
            "price": 40,
            "num": 1
        }
    ]
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值