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 可以使用多次

你可能感兴趣的:(mongoDb,mongoose)