使用聚合管道可以对集合中的文档进行变换和组合。 实际项目:表关联查询、数据的统计。
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.userJson
const { start_time, end_time } = req.query
const 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为开始 所以要减1
const getSize = parseInt(pageSize) //获取显示多少条 10
const 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 }))
}
}