mongo聚合框架
概念(个人理解)
个人理解:这个是mongo专本用来统计数据使用的。
通过管道处理集合中的文档。
例如:筛选(filtering),投射(projecting),
分组(grouping),排序(sorting),
限制(limiting),跳过(skipping)。
优点
简化应用程序代码
约束资源需求
发现的坑-也许是我使用问题
- 超大数据集索引尽量就不要创建了(eg:亿级就不要尝试了)。
(我比较菜,这个是有故事的,千万级别的使用后台创建应该没什么问题) - 复合索引建的时候要看好,内部字段对应的索引规则,以及索引顺序,否则复合索引是不生效的(未测试,待验证)
- 索引删除后内存不会立即下降,使用管理员账号操作该语句可以实现db.runCommand({closeAllDatabases:1}),但是!!!建议在有备库等情况下操作。
待考证
Mongodb对内存的使用是没有限制的,它会一直耗尽服务器所有内存,但是据说在其他应用程序申请内存时,它会自动释放一些内存。
管道
概念理解(个人理解)
流水线操作,操作完成之后的结果,作为下一个操作的入参,一步一步的进行操作处理。管道操作可重复,eg:筛选-排序-筛选。管道操作只针对单一文档。
管道操作
$match:sql-where操作(过滤)
db.getCollection("集合名称).aggregate([
{
$match: {
表字段1: 筛选条件1,
表字段2: 筛选条件2,
...
}
}
])
$match里的常用操作
$eg/ $gt/ $gte/ $lt / $lte
$and / $or / $not / $in
$project: (修改输入文档结构-限制入参-投影)
投影中也可以操作入参类型,值等。。(eg:截取字段前2位作为入参。)
db.getCollection("集合名称).aggregate([
{
$project:{
"name":"$表字段1",
"age":"$表字段2",
"表字段名称":{$substr ["$字段", 0, 2]}
.......
}
}
])
$group
group by 分组
db.getCollection("app_track_data").aggregate([
{
$group: {
_id: {
表字段1: "$表字段1",
表字段2: "$表字段2",
.....
},
total: {
$sum: 1
}
}
}
])
$group 操作
$sum / $avg / $max /min
(还有很多。我懒了。)
详细请参考。(我觉得很详细了)
https://blog.csdn.net/xiewenfeng520/article/details/114577394?utm_source=app&app_version=4.5.8
我暂时只是写了我用到的3个,下面我要写聚合框架的索引。
索引
应用索引(使用实现语句)
- 创建索引:db.COLLECTION_NAME.createIndexes({索引键名:排序规则})
- 删除索引:db.COLLECTION_NAME.dropIndex(“索引名称”)
- 删除全部索引:db.COLLECTION_NAME.dropIndexes()
- 重建索引:db.COLLECTION_NAME.reIndex()
- 创建复合索引(后台创建):db.c1.createIndex({name:1,age:1},{background:true});