mongodb 子查询+无限级查询

85 阅读1分钟

var express = require('express');

var router = express.Router();

var {userModel,userInfoModel,categoryModel} = require("../model/model")

/**

  • 关联查询  aggregate

  • xxxModel.agggregate([{},{},...])  //语法格式

  • $lookup : {} 关联查询

  • $match : {} 条件查询

  • $skip : 数值

  • $limit : 数值  分页查询

  • $sort : {}  排序

  • $group : {} 分组查询

  • $project:{字段:1}  查询指定字段

*/

//查询用户详细信息

router.get('/userInfo_list',async function(req,res,next){

  /*let data = await userInfoModel.aggregate([

    {$match:{nichname:'小鱼'}},

    {$skip:1}

  ])*/

  // 关联查询 $lookup  匹配项使用

  // 使用详细信息 并关联该详细信息对应的账号

  let data = userInfoModel.aggregate([

    {$lookup:{

      from:'users',  //别关联的集合名

      localField:'user', //当前查询的model中关联的字段

      foreignField:'_id', // 被关联的集合中的字段

      as:'user' //关联查询的结果的别名          //数组

    }}

  ])

  res.json(data)

})

//  分组查询

//按照性别进行分组  查询  用户的平均年龄

router.get('/group_by_sex',async (req,res)=>{

  let data = await userInfoModel.aggregate([

    {$group:{

      _id:"sex",//分组的字段 sex" ,//分组的字段  xxx

      avgAge: { avg:"avg : "age" }  //统计平均年龄

    }}

  ])

  // let data = await userInfoModel.aggregate([

  //  {$group:{

  //    _id:"$sex",  //分组的字段

  //    count:{ $sum: 1  }  //统计男女生人数

  //  }}

  // ])

  //子查询: 自己查询自己  集合需要有一个pid字段

/**

  • 商品无分离

  • 分类集合 cates

  • name

  • level

  • pid

  • id  name    pid  level

  • 1    服装            1

  • 2    家电            1

  • 3    男装    1      2

  • 4    女装    1      2

  • 5    男装衬衫  2    3              ???

*/

  res.json(data)

})

//自查询

router.get('/category_list',async function(req,res,next){

  let data = await categoryModel.aggregate([

    {$lookup:{

      from:'category',

      localField:'_id',

      foreignField:'pid',

      as:'childern',

      // pipeline:[

      //  //管道查询 上一级查询的结果会自动进行下一级进行查询

      //  {$lookup:{

      //    from:'category',

      //    localField:'_id',

      //    foreignField:'pid',

      //    as:'childern'

      //  }}

      // ]

    }},

    // {$match:{level:1}}

  ])

  res.json(data)

})

//无限级分类 自封装的代码

router.get('/cates_list',async (req,res,next)=>{

  // mongoose中查询出来的数组对象不能直接添加新属性,需要lean()方法

  let cates = await categoryModel.find().lean()      //.lean()  添加动态属性

  let data = []  //最终结果的数组

  let jsonCate = {}    //一个对象中添加多个键值对

  //遍历cates所有数据 形成 以_id为键 _id对应的这条数据为值的一个json对象

  cates.forEach(item=>{

    jsonCate[item._id] = item

  })

  // 遍历cates

  cates.forEach(item=>{

    // 判断是否是一级分类,如果是一级分类,直接添加到存放结果的数组data中

    if(!item['pid']){  // 一级分类

      data.push(item)

    }else{

      //说明不是一级分类 判断当前分类商品的父级是否有children属性

      if(!jsonCate[item['pid']]['children']){ //当前分类商品的父级没有children属性

        jsonCate[item['pid']]['children'] = []

      }

      jsonCate[item['pid']]['children'].push(item)

    }

  })

  res.json(cates,jsonCate,data)

})

/* GET users listing. */

router.get('/', function(req, res, next) {

  res.send('respond with a resource');

});

module.exports = router;