不会跑

work for life

20 Apr 2017

MongoDB的数据聚合使用实例

由于妹子的毕业设计项目就是用的mongodb,所以对mongodb有初步接触,熟悉了基本用法和特性,但是毕竟毕业设计的项目是个玩具,所以一直没有接触到mongodb的数据聚合,直到有一天领导叫我生成质量的报表时,我开始接触使用;

所谓数据聚合就是对一个数据进行多次处理,而每一阶段的处理结果将用管道传到下一阶段,管道的解释为:在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。而MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理;且管道操作是可以重复的。

这里列举几个常用聚合操作:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。

下面是我的部分代码:



from pymongo import ReturnDocument
from pymongo import MongoClient
from bson import json_util

import time
import sys
import os
# 最终写到csv文件里
import csv

# from pdb import set_trace

client = MongoClient('xxx.xxx.xxx.xxx', 27714)
DB = client.quality


def find_data(role, line, day):
    result = DB.line.aggregate(
    [{'$match': {'line': line, 'role': role}},
    {'$sort': {'time': -1}},
    {'$limit': day},
    {'$group': {'_id': {'role': '$role', 'line': '$line'}, 'time': {'$avg': '$TotalTime'}, 'success': {'$sum': '$Success'}, 'total': {'$sum': '$Total'}}},
    {'$project': {'_id': 0, 'time': 1, 'result': {'$divide': ['$success', '$total']}}}])
    return result
comments powered by Disqus