使用聚合管道可以对集合中的文档进行变换和组合。 实际项目:表关联查询、数据的统计。
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(“字段名”); 去重复字段. 只显示不重复的字段
演示数据



查询
exports.getOrderFind = async (req, res, next) => {const { _id, email } = req.userJsonconst { start_time, end_time } = req.queryconst queryData = {}let data = {}const cardGetDate = await Busin_game_order.aggregate([{$match: { create_item: { $gte: start_time, $lte: end_time }, start: { $eq: true } },},{$group: {_id: 'orderSystem',number: { $sum: 1 },profit: { $sum: '$profit' }, // 当前订单 总利润income_price: { $sum: '$income_price' }, // 全部订单 总额度bate_expend: { $sum: '$bate_expend' }, // 打手总支出}}])data = cardGetDate[0]console.log(data)res.send({ data, msg: 'ok' })}
exports.getOrder = async (req, res, next) => {let { pageNo, pageSize, order_source, order_type, tabel_name, outsource, order_siberian, content, ex_date1, ex_date2 } = req.query// console.log(req.query)const userJson = dealJSON(req.userJson)const queryData = {}if (ex_date1 !== undefined && ex_date2 !== '' && ex_date2 !== undefined && ex_date2 !== '') {queryData.create_item = { "$gte": ex_date1 + ' 00:00:00', "$lte": ex_date2 + ' 23:59:59' }}if (order_source !== undefined && order_source !== '') {queryData.order_name = order_source}if (order_type !== undefined && order_type !== '') {queryData.order_type = order_type}if (tabel_name !== undefined && tabel_name !== '') {queryData.tabel_name = tabel_name}if (order_siberian !== undefined && order_siberian !== '') {queryData.order_data = {"$elemMatch": { order: order_siberian } }}if (content !== undefined && content !== '') {queryData.content = {"$regex":content}}if (outsource !== undefined && outsource !== '') {queryData.outsource = {"$regex":outsource}}let softGetDate = dealJSON(await Busin_game_order.find({})) // 获取所有的订单if (softGetDate != '' || softGetDate != null) {const totalCount = parseInt(softGetDate.length) //获取总数据const getPage = parseInt(pageNo) - 1 //获取的页数 前端传来的 page =1 mongodb数据库 0为开始 所以要减1const getSize = parseInt(pageSize) //获取显示多少条 10const totalPage = parseInt(totalCount / pageSize)await Busin_game_order.find(queryData).sort([['create_item',-1]]).skip(getPage * getSize).limit(getSize).exec((err, data) => {if (!err) {return res.send(builder({ pageSize: getSize, pageNo: getPage <= 0 ? 1 : getPage + 1, totalCount: totalCount, totalPage: totalPage <= 0 ? 1 : totalPage, data: dealJSON(data) }))}})} else {// 返回 10条数据: pageSize 1页:pageNo 总数据200条:totalCount 总页数 10页 :totalPage 具体数据 空return res.send(builder({ pageSize: getSize, pageNo: getPage, totalCount: totalCount, totalPage: totalPage, data: softGetDate }))}}
