数据
for (i = 0; i < 100; i++) {
db.machineLog.insert({
"content": "机械日志" + i,
"machineName": "测试机械00" + i,
"categoryId": i % 3,
"machineId": i % 8,
"price": (i % 7) * (i % 5) * 32,
"createdAt": new Date()
})
}
引子
获取MongoDB存储的数据,往往不是直接提取出来就可以使用的,需要对数据进行处理和分析后才可以使用。MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce 函数和单一目的聚合方法。
语法
db.COLLECTION_NAME.aggregate( [ {}, {}, ... ] )
其中每个'{}'标识一个阶段。
操作符
$match
用于过滤数据,只输出符合条件的文档,SQL Example:
SELECT *
FROM machine
WHERE machineName = '测试机械002'
MongoDB Example:
db.machineLog.aggregate([
{
$match: {
machineName: '测试机械002'
}
}
])
$group
将集合中的文档分组,可用于统计结果,SQL Example:
SELECT machineId,
SUM(price) AS total
FROM machineLog
GROUP BY machineId
db.machineLog.aggregate([
{
$group: {
_id: "$machineId",
total: {
$sum: "$price"
}
}
}
])
即将machineId进行分组后,对price进行求和。
$project
修改输入文档的结构,限定结果集合,SQL Example:
SELECT machineId FROM orders
MongoDB Example:
db.machineLog.aggregate([
{
$project: {
machineId: "$machineId",
}
}
])
#### $sort
将输入文档排序后输出,SQL Example:
```SQL
SELECT machineId FROM machineLog ORDER BY id
MongoDB Example:
db.machineLog.aggregate([
{
$sort: {
id: 1
}
}
])
其他
MongoDB 聚合运算符还有很多,这里只对常用的做了简单的描述,具体的可以参照下表:
SQL Terms, Functions, and Concepts | MongoDB Aggregation Operators |
---|---|
WHERE | $match |
GROUP BY | $group |
HAVING | $match |
SELECT | $project |
ORDER BY | $sort |
LIMIT | $limit |
SUM() | $sum |
COUNT() | sortByCount |
JOIN | $lookup |
SELECT INTO NEW_TABLE | $out |
MERGE INTO TABLE | $merge (Available starting in MongoDB 4.2) |
聚合管道
MongoDB’s aggregation framework is modeled on the concept of data processing pipelines. Documents enter a multi-stage pipeline that transforms the documents into an aggregated result.
聚合管道操作有如:分组(project)、排序(count)等,每个操作在管道中叫做阶段(stage),每个阶段执行的结果会给下一个阶段。
如图:
../images/map-reduce.bakedsvg.svg
其类似Linux中的管道操作:
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
分四步:
- /dev/urandom 中读取字符
- tr 命令过滤出字母及数字
- 通过 fold 每行进行切割
- 选择输出第一行
示例一
db.machineLog.aggregate([
{
$match: {
categoryId: 2
}
},
{
$group: {
_id: "$machineId",
total: {
$sum: "$price"
}
}
},
{
$match: {
total: {
$gt: 800
}
}
}
])
上面示例分为三步:
- 查询categoryId=2的数据
- 对上一步查询的数据以machineId分组后,对price进行求和
- 找出求和后大于800的数据
查询结果为:
{
"_id": 1,
"total": 1024
}
{
"_id": 3,
"total": 1088
}
网友评论