mongoose学习笔记(六)aggregate 聚合管道的使用

aggregate聚合管道实际上就是多表查询。

适用场景:
假如mongodb数据库中的一个集合记录了一个学校的所有班级,当查询某个班级的时候想把该班级的所有学生也查询出来,但学生并不在这个集合中(也可以在这个集合中,但会影响数据库的查询,也不利于数据的管理,相信没有哪个学校会这样做),这就需要在进行一次查询,会浪费一部分时间,也需要更多的代码。

而使用aggregate的好处在于只需要修改一行代码再增加一行代码就可以了。

下面以订单和商品两个集合为例:
查询某一个订单,并将此订单中的商品也列出来

var mongoose=require('./db.js');   // db.js文件进行连接数据库
var OrderSchema=mongoose.Schema({    //创建schema,定义相关的字段
    order_id:String, 
    uid:Number, 
    trade_no:String, 
    all_price:Number, 
    all_num:Number 
}) 
var OrderModel=mongoose.model('Order',OrderSchema,'order');   //定义模型,和相关的集合
OrderModel.aggregate(
    [{ 
        $lookup: {     //定义规则
          from:'order_item',   //在order_item集合中查找
          localField:"order_id",   //当前查询的字段
          foreignField:"order_id",   //对应order_item集合的哪个字段
          as:"item"            //在查询结果中键值
        }
    },
    {$skip: 10}, // 跳过 collection 的前 10 行
    ],
    function(err,docs){ 
        console.log(docs) 
    }
);

查询时一些常用的方法:

$match 聚合前数据筛选

$skip 跳过聚合前数据集的 n 行, 如果 {$skip: 10}, 最后 rows = 5000000 - 10

$project 之选择需要的字段, 除了 _id 之外其他的字段的值只能为 1

$redact 看了文档不明其实际使用场景, 这里只是简单筛选聚合前的数据

$group 指定各字段的累加方法

$unwind 拆分 array 字段的值, 这样会导致 _id 重复

$project 可重复使用多次 最后用来过滤想要存储的字段

$out 如果 $group/$project/$redact 的 _id 没有重复就不会报错

以上方法中 $project/$redact/$group/$unwind 可以使用多次

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旁观者lgp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值