基本说明
作用
对mongodb的collection进行运算,筛选,截取,排序操作
语法
db.collection.aggregate(pipeline)
pipeline是要执行的聚合说明
pipeline 格式
dict类型或包含多个dict的列表:{}
或 [{},…,{}]
,mongodb会顺序执行列表里面的操作
{$操作符:{操作}}
mongodb提供了非常多的操作符,这里只选取常用的几个进行说明 常用操作
$project
重命名及增加,删除字段
例子:
db.collection.aggregate({'$project': { key1:1, // 保留key1字段 key2:0, //不要key2字段(常用以去掉'_id',因为'_id'会默认被包含) keyalias:'$key3'//将key3字段重命名为keyalias }}
$match
过滤筛选操作
match语法和db.collection.find()语法相同$limit
现在数据条数
如:db.collection.aggregate({$limit:5})
: 只返回最多5条数据 $skip
从数据集合开始跳过n条数据
语法和$limit 一样,n为正整数$unwind
将数组元素拆分成独立字段
语法{$unwind:'$字段名'},该字段的值必需是数组例子:
假设collection 原版的数据是:{_id:xxxxxxx, key1: [ {subk1: value, subk2: value }, {subk3: value, subk2: value }], key2: value, key3: value}
通过db.collection.aggregate({$unwind:'$key1'})
后:
{result:[ { _id: xxxxxxx, key1: {subk1: value, subk2: value}, key2: value, key3:value }, { _id: xxxxxxx key1: {subk3: value, subk2: value}, key3: value } ] }
$group
根据指定字段值进行分组,可以包含算数类型的表达式操作符
例子:
假设collection数据为[{ _id: xxxxxxx, key1: v1, key2: 2, }, { _id: xxxxxxxx, key1: v2, key2: 5 }, { _id: xxxxxxx, key1: v1, key2: 7 },]db.collection.aggregate({$group:{_id:'$key1', key2sum:{$sum :'$key2'}}})
结果为:
{result:[ {key1: v1, key2sum: 9}, {key1: v2, key2sum: 5} ]}
$sort
对结果进行排序**,语法和db.collection.find().sort()语法一致
{$sort:{key1: -1, key2:1}}
: key1值降序,key2值升序 常用操作示例
取某一段范围
pipeline = {$match:{ts:{$gte: 100000, $lt:120000}}}
筛选出ts在[100000, 120000] 之间的数据
去掉值为null的数据
pipeline = {$match:{key1:'$ne':null}}
去掉key1为null的数据
多个操作组合示例
pipeline = [{'$project':{'minu': 1, '_id': 0, 't': 1, 'r': 1}}, {'$unwind': '$minu'}, {'$match': {'minu': {'$ne': None}}}, {'$project': {'r': 1, 'trans_count': '$minu.k', 'ts': {'$add': ['$t', '$minu.t']}}}, {'$match': {'ts': {'$gte': 1457059140, '$lt': 1457060040}}}, {'$project': {'trans_count': 1, 'id': 0, 'r': 1}}, {'$group': {'trans_count': {'$sum': '$trans_count'}, 'id': '$r'}}, {'$project': {'trans_count': 1, 'id': 0, 'ret_code': '$id'}}, {'$sort': {'trans_count': -1, 'ret_code': 1}}]
mongodb会顺序执行以下内容:
获取minu, t, r 字段的内容, 去掉_id字段
分解minu的数据
去掉minu字段为null的数据
将保留r字段, minu.k重命名为trans_count, ts为t和minu.t的和
获取ts在[1457059140, 1457060040]之间的数据
获取trans_count, r 字段
按照r字段的值分组,同一个r值得trans_count相加(id的值是r字段的内容)
保留trans_count字段,_id重命名为ret_code
根据trans_count降序,ret_code升序排列