使用聚合管道可以对集合中的文档进行变换和组合。 实际项目:表关联查询、数据的统计。
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{},…]) 方法 来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。
在使用这些命令的时候,感觉,这种命令类似于封装好的, 就好像跟批量修改,批量删除一样,我想这是批量查询

聚合操作命令

方法
$project 筛选指定(显示)的字段
$match 条件
$group 分组
$sort 排序 升序 1 降序-1
$limit 限制 前3条 后3条
$skip 跳过 第几个数据
$lookup 多表关联 查询
运算属性
$sum 求和 $sum: 1表示自动计算, $sum: '$income_price' 表示使用字段计算
$max $max: '$profit' 求最大值 表示使用数据库的字段计算
$min $min: '$profit' 求最小值 表示使用数据库的字段计算
$avg $avg: '$profit' 求平均值 表示使用数据库的字段计算
$push $push: '$order_data' 按照 order_data 分组并返回他们的 title
$unwind $unwind: '$order_data' 将数组中的内容拆分显示
$toLower $toLower: '$profit' 转换成小写
$toUpper $toUpper: '$profit' 转换成大写
$concat $concat: ['$game_name', '----', 'order_name']字符串连接
$substr [$substr: ['$profit', 0, 2]字符串截取(英文,数字)
$substrCP $substrCP: ['$profit', 0, 2] 字符串截取(中文)
$add(+) $add: ['$profit', 1]该字段自加1
$ne $ne: null 排除没有 profit 字段的文档
$inc $inc:{'integral': -10} 10 该字段 自加或自减 有效
$subtract(-) $subtract: {'$profit': 1}该字段 自减 1
$multiply(*) $multiply: {'$profit': 1}该字段 自乘 1
$divide(/) $divide: {'$profit': 1}该字段 自除 1
$mod(%) $mod: {'$profit': 2}该字段 自余数 2
$eq 等于
$gt 大于
$gte 大于或等于
$lt 小于
$lte 小于或等于
$in {$in: batchOrder} 批量查询 batchOrder是一个数组, 只返回有的数据
$all {$all: batchOrder} 批量查询 满足batchOrder中所有的值, 才返回
$facet { $facet:{ } }创建多个管道
$regex {'$regex': 444}模糊查询

db.getCollection(“表名”).distinct(“字段名”); 去重复字段. 只显示不重复的字段

演示数据

image.png
image.pngimage.png

查询

  1. exports.getOrderFind = async (req, res, next) => {
  2. const { _id, email } = req.userJson
  3. const { start_time, end_time } = req.query
  4. const queryData = {}
  5. let data = {}
  6. const cardGetDate = await Busin_game_order.aggregate([
  7. {
  8. $match: { create_item: { $gte: start_time, $lte: end_time }, start: { $eq: true } },
  9. },
  10. {
  11. $group: {
  12. _id: 'orderSystem',
  13. number: { $sum: 1 },
  14. profit: { $sum: '$profit' }, // 当前订单 总利润
  15. income_price: { $sum: '$income_price' }, // 全部订单 总额度
  16. bate_expend: { $sum: '$bate_expend' }, // 打手总支出
  17. }
  18. }
  19. ])
  20. data = cardGetDate[0]
  21. console.log(data)
  22. res.send({ data, msg: 'ok' })
  23. }
  1. exports.getOrder = async (req, res, next) => {
  2. let { pageNo, pageSize, order_source, order_type, tabel_name, outsource, order_siberian, content, ex_date1, ex_date2 } = req.query
  3. // console.log(req.query)
  4. const userJson = dealJSON(req.userJson)
  5. const queryData = {}
  6. if (ex_date1 !== undefined && ex_date2 !== '' && ex_date2 !== undefined && ex_date2 !== '') {
  7. queryData.create_item = { "$gte": ex_date1 + ' 00:00:00', "$lte": ex_date2 + ' 23:59:59' }
  8. }
  9. if (order_source !== undefined && order_source !== '') {
  10. queryData.order_name = order_source
  11. }
  12. if (order_type !== undefined && order_type !== '') {
  13. queryData.order_type = order_type
  14. }
  15. if (tabel_name !== undefined && tabel_name !== '') {
  16. queryData.tabel_name = tabel_name
  17. }
  18. if (order_siberian !== undefined && order_siberian !== '') {
  19. queryData.order_data = {"$elemMatch": { order: order_siberian } }
  20. }
  21. if (content !== undefined && content !== '') {
  22. queryData.content = {"$regex":content}
  23. }
  24. if (outsource !== undefined && outsource !== '') {
  25. queryData.outsource = {"$regex":outsource}
  26. }
  27. let softGetDate = dealJSON(await Busin_game_order.find({})) // 获取所有的订单
  28. if (softGetDate != '' || softGetDate != null) {
  29. const totalCount = parseInt(softGetDate.length) //获取总数据
  30. const getPage = parseInt(pageNo) - 1 //获取的页数 前端传来的 page =1 mongodb数据库 0为开始 所以要减1
  31. const getSize = parseInt(pageSize) //获取显示多少条 10
  32. const totalPage = parseInt(totalCount / pageSize)
  33. await Busin_game_order.find(queryData).sort([['create_item',-1]]).skip(getPage * getSize).limit(getSize).exec((err, data) => {
  34. if (!err) {
  35. return res.send(builder({ pageSize: getSize, pageNo: getPage <= 0 ? 1 : getPage + 1, totalCount: totalCount, totalPage: totalPage <= 0 ? 1 : totalPage, data: dealJSON(data) }))
  36. }
  37. })
  38. } else {
  39. // 返回 10条数据: pageSize 1页:pageNo 总数据200条:totalCount 总页数 10页 :totalPage 具体数据 空
  40. return res.send(builder({ pageSize: getSize, pageNo: getPage, totalCount: totalCount, totalPage: totalPage, data: softGetDate }))
  41. }
  42. }