python从mongodb里取出数据进行可视化_Python数据分析及可视化实例之MongoDB增删改查...

1.MongoDB安装

有时候度娘还是给力的,相反一些博客的安装方法则显得凌乱:

最初使用Win7安装经常会出现意料不到的错误,

比如开机启动服务,服务器日志等。

上面链接安装步骤简单,没有炫技的成分,赞一个。

2.基本操作:增删改查

在Python中操作该数据库,需要安装依赖库Pymongo,

如果你采用其他的库请参照响应的文档,比如MongoEngine。

下面的代码在Pymongo文档的基础上DIY类,比较完善。

不用该类也是可以的,用的时候再直接粗暴操作,MongoDB也喜欢。

# encoding: utf-8

__author__ = 'yeayee' 2015-07

from pymongo import MongoClient

from pymongo import errors

import json

from datetime import date, datetime

# 数据库日志配置

from log import Logger

my_logger = Logger('mongodb', 'mongodb.log', 'DEBUG')

my_logger.set_file_level('DEBUG')

my_logger.set_stream_level('WARNING') # WARNING DEBUG

my_logger.set_stream_handler_fmt('%(message)s')

my_logger.load()

logger = my_logger.logger

# my_logger.get_memory_usage()

class Mongodb():

"""

自定义mongodb工具

"""

def __init__(self, db_config, db_name=None):

self.db_config = db_config

if db_name is not None:

self.db_config['database'] = db_name

try:

# 实例化mongodb

self.conn = MongoClient(self.db_config['host'], self.db_config['port'])

# 获取数据库对象(选择/切换)

self.db = self.conn.get_database(self.db_config['database'])

except errors.ServerSelectionTimeoutError, e:

logger.error('连接超时:%s' % e)

except Exception as e:

logger.error(e)

@staticmethod

def __default(obj):

"""

支持datetime的json encode

TypeError: datetime.datetime(2015, 10, 21, 8, 42, 54) is not JSON serializable

:param obj:

:return:

"""

if isinstance(obj, datetime):

return obj.strftime('%Y-%m-%d %H:%M:%S')

elif isinstance(obj, date):

return obj.strftime('%Y-%m-%d')

else:

raise TypeError('%r is not JSON serializable' % obj)

def close_conn(self):

"""

关闭连接

关闭所有套接字的连接池和停止监控线程。

如果这个实例再次使用它将自动重启和重新启动线程

"""

self.conn.close()

def find_one(self, table_name, condition=None):

"""

查询单条记录

:param table_name:

:param condition:

:return:

"""

return self.db.get_collection(table_name).find_one(condition)

def find_all(self, table_name, condition=None):

"""

查询多条记录

:param table_name:

:param condition:

:return:

"""

return self.db.get_collection(table_name).find(condition)

def count(self, table_name, condition=None):

"""

查询记录总数

:param table_name:

:param condition:

:return:

"""

return self.db.get_collection(table_name).count(condition)

def distinct(self, table_name, field_name):

"""

查询某字段去重后值的范围

:param table_name:

:param field_name:

:return:

"""

return self.db.get_collection(table_name).distinct(field_name)

def insert(self, table_name, data):

"""

插入数据

:param table_name:

:param data:

:return:

"""

try:

ids = self.db.get_collection(table_name).insert(data)

return ids

except Exception, e:

logger.error('插入失败:%s' % e)

return None

def update(self, table_name, condition, update_data, update_type='set'):

"""

批量更新数据

upsert : 如果不存在update的记录,是否插入;true为插入,默认是false,不插入。

:param table_name:

:param condition:

:param update_data:

:param update_type: 范围:['inc', 'set', 'unset', 'push', 'pushAll', 'addToSet', 'pop', 'pull', 'pullAll', 'rename']

:return:

"""

if update_type not in ['inc', 'set', 'unset', 'push', 'pushAll', 'addToSet', 'pop', 'pull', 'pullAll', 'rename']:

logger.error('更新失败,类型错误:%s' % update_type)

return None

try:

result = self.db.get_collection(table_name).update_many(condition, {'$%s' % update_type: update_data})

logger.info('更新成功,匹配数量:%s;更新数量:%s' % (result.matched_count, result.modified_count))

return result.modified_count # 返回更新数量,仅支持MongoDB 2.6及以上版本

except Exception, e:

logger.error('更新失败:%s' % e)

return None

def remove(self, table_name, condition=None):

"""

删除文档记录

:param table_name:

:param condition:

:return:

"""

result = self.db.get_collection(table_name).remove(condition)

if result.get('err') is None:

logger.info('删除成功,删除行数%s' % result.get('n', 0))

return result.get('n', 0)

else:

logger.error('删除失败:%s' % result.get('err'))

return None

def output_row(self, table_name, condition=None, style=0):

"""

格式化输出单个记录

style=0 键值对齐风格

style=1 JSON缩进风格

:param table_name:

:param condition:

:param style:

:return:

"""

row = self.find_one(table_name, condition)

if style == 0:

# 获取KEY最大的长度作为缩进依据

max_len_key = max([len(each_key) for each_key in row.keys()])

str_format = '{0: >%s}' % max_len_key

keys = [str_format.format(each_key) for each_key in row.keys()]

result = dict(zip(keys, row.values()))

print ('********** 表名[%s] **********' % table_name)

for key, item in result.items():

print key, ':', item

else:

print (json.dumps(row, indent=4, ensure_ascii=False, default=self.__default))

def output_rows(self, table_name, condition=None, style=0):

"""

格式化输出批量记录

style=0 键值对齐风格

style=1 JSON缩进风格

:param table_name:

:param condition:

:param style:

:return:

"""

rows = self.find_all(table_name, condition)

total = self.count(table_name, condition)

if style == 0:

count = 0

for row in rows:

# 获取KEY最大的长度作为缩进依据

max_len_key = max([len(each_key) for each_key in row.keys()])

str_format = '{0: >%s}' % max_len_key

keys = [str_format.format(each_key) for each_key in row.keys()]

result = dict(zip(keys, row.values()))

count += 1

print ('********** 表名[%s] [%d/%d] **********' % (table_name, count, total))

for key, item in result.items():

print key, ':', item

else:

for row in rows:

print (json.dumps(row, indent=4, ensure_ascii=False, default=self.__default))

注:上面的类初学者能看懂最好,看不懂就只看数据库操作相关命令即可。 之所以分享这个类操作,在Flask Web开发过程中要用到类的继承,实现记录用户登录状态。如果你接下来并不打算开发Web也不想用Web数据可视化,那么给你最粗暴的操作方法:

# encoding: utf-8

__author__ = 'yeayee' 2015-08

from pymongo import MongoClient

client = MongoClient(host='localhost', port=27017)

db = client.test # 直接建立一个测试数据库

collection = db.students # 在上数据库建立一个集合

student = {

'id': '20170101',

'name': 'Jordan',

'age': 20,

'gender': 'male'

} # 声明一条数据

# 增

collection.insert(student) # 插入数据

# 改,发现年龄错了,加1岁

collection.update_one({'name': 'Jordan'}, {'$inc': {'age': 1}})

# 查

result = collection.find_one({'name': 'Jordan'}) # 查询数据,返回的是一个游标

print(result)

#

# 删

result = collection.remove({'name': 'Jordan'}) # 返回删除状态

print(result)

# {'ok': 1, 'n': 1}

注:增删改查没这么简单,只是举了一个最简单的例子,有一本《MongoDB权威指南》,可以自己找PDF版;如果决定用这货,黑框下面操作MongoDB是逃不掉的。此外,在win平台下推荐软件Robomongo,可视化操作数据集合。嗯,具体到插入多条,更改多条数据,聚类操作、地理位置信息聚类等,等实例源码中慢慢解说。

胶水语言博大精深,

本主只得一二为新人带路,

新手可查阅历史目录:yeayee:Python数据分析及可视化实例目录​zhuanlan.zhihu.comv2-71190d104bd0169b6f57d520f5a1ce88_180x120.jpg

最后,别只收藏不关注哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值