2.4 MongooDB聚合管道

可以对集合中的文档数据进行变换和组合

// 通过
db.orders.aggregate([
    {$match:{username:"zhangsan"}},
    {$group:{age:30,total:{$sum:'$amount'}}}
])

上面的代码是先查到 username 是张三的人,然后对所有的张三进行分组 30岁的一组 不是三十的一组,这个操作会返回连个组合

常见的操作符

$project 添加 删除 命名  需要显示的列
$lookup 引入其他集合数据  关联查询
$match 条件匹配 满足条件筛选进入下一组管道 相当于mysql的have
$group 条件组合结果  统计 相当于 groupby
$sort  条件排序
$skip 跳过
$limit 限制数量
$unwide 拆分数组

$project 管道操作符

db.users.aggregate([{$project:{username:1}}])
// 表示 查找users 表 只显示 username  于find 第二个参数select 使用方式类似

$match 匹配

db.users.aggregate([{$project:{username:1}},{$match:{username:'zhangsan'}}])
// 相当于
db.users.find({username:'zhangsan'},{username:1})

$group 分组

group分组后可以进行统计

db.users.aggregate([
    {$project:{username:1}},
    {$match:{username:'zhangsan'}},
    {$group:{_id:'$username',totle:{$sum:'$age'}}},
    //注意     此处有一个再承参数前有一个$


])

$sort 排序

db.users.aggregate([
    {$project:{username:1,age:1}},
    {$match:{username:'zhangsan'}},
    {$sort:{"age":1}}
    //1 表示正序  -1 表示负序
])

$limit 限制条数

db.users.aggregate([
    {$project:{username:1,age:1}},
    {$match:{username:'zhangsan'}},
    {$limit:2}
   // 只返回2条
])

$skip 跳过几条

db.users.aggregate([
    {$project:{username:1,age:1}},
    {$match:{username:'zhangsan'}},
    {$skip:2}
    //跳过前两条
])

$lookup 用于表的关联操作

db.users.aggregate([
    {
        $lookup:{
            from:"context", // 表示需要于哪个表进行关联
            localField:"userID",//表示主查表users 的关联字段  userID
            foreignField:"userID",//表示子表的context的关联字段 userID  这连个字段是相关联但是名称 不一定一样
            as:"items"}},
    //需要把数据放到什么字段内  这样就可以把查询到的数据放到items内  
    // items  是一个数组
    {
        $match:{ //$lookup  后使用match  对数据继续进行筛选
            age:{
                $gt:20
            }
        }
    }

])

Last updated

Was this helpful?