热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pymongo介绍和使用示例

背景最近项目中用到了mongodb,并且用python的pymongo包操作。本文就把目前遇到的问题和学习经历做个小结,方便日后查询。Mongodb启动安装mongodbhttp

背景

最近项目中用到了mongodb,并且用python 的pymongo包操作。本文就把目前遇到的问题和学习经历做个小结,方便日后查询。

Mongodb启动
  1. 安装mongodb
    https://www.mongodb.com/download-center#community
  2. 配置环境变量
    把mongodb安装路径下的bin文件路径加入系统环境变量,我这里路径是 D:\MongoDB\bin
  3. 设置数据存放的根目录。开启命令行窗口(开始—>运行—>cmd),输入命令
    mongod --dbpath D:\Mongodb\data
    这里写图片描述
    看到如下信息就OK了
    这里写图片描述

mongodb默认的端口号27017。我们也可以在配置时指定端口。例:如果我们想指定mongodb的服务端口号为10001,命令如下:
mongod --dbpath D:\Mongodb\data --port 10001
在浏览器输入: http://localhost:27017 可以看到如下提示:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
此时,Mongodb数据库服务已经完全启动了。
此部分参考:http://chenzhou123520.iteye.com/blog/1582174

Robomongo 使用

基本使用

  1. 安装mongodb的客户端管理工具robomongo。并创建一个名为test的新连接。
    下载地址:https://robomongo.org/
    这里写图片描述
  2. 新建数据库
    右键连接名—> create DataBase。新建一个名为“xyd”的数据库,下文会用到。
    这里写图片描述
  3. 新建表
    右键Collections —> create Collection。这里一个Collection相对于关系型数据库中的表概念。新建一张“mytest”的表,下文会用到。
    这里写图片描述

Robomongo 快捷键

    Ctrl+R 刷新界面
Ctrl+T 打开新的命令窗口
Ctrl+Enter 运行命令

Mongo命令

关于插入和查询命令,以下网站做了不错的总结,这里就不重复造轮子了。
http://www.cnblogs.com/stephen-liu74/archive/2012/08/03/2553803.html
http://www.cnblogs.com/viviman/archive/2012/11/21/2780562.html
http://www.runoob.com/mongodb/mongodb-insert.html

Pymongo 使用

pymongo是python操作 mongodb的工具包。不做概念性的介绍了,以下为直接操作。

pymongo 安装

  • 安装python,设置好环境变量
  • 安装python包管理工具pip
  • 用pip安装pymongo
    项目主页:http://api.mongodb.com/python/current/installation.html
    安装命令:
    python -m pip install pymongo
    之前使用过的话,就升级pymongo:
    python -m pip install --upgrade pymongo

    我之前安装过,在此就升级了包。结果如下图:3.0.1升级到3.3.0,
    这里写图片描述

pymongo 测试

  • 连接类
# -*- coding: utf-8 -*-
import pymongo
import sys
import traceback

MONGODB_COnFIG= {
'host': '127.0.0.1',
'port': 27017,
'db_name': 'xyd',
'username': None,
'password': None
}

class MongoConn(object):

def __init__(self):
# connect db
try:
self.cOnn= pymongo.MongoClient(MONGODB_CONFIG['host'], MONGODB_CONFIG['port'])
self.db = self.conn[MONGODB_CONFIG['db_name']] # connect db
self.username=MONGODB_CONFIG['username']
self.password=MONGODB_CONFIG['password']
if self.username and self.password:
self.cOnnected= self.db.authenticate(self.username, self.password)
else:
self.cOnnected= True
except Exception:
print traceback.format_exc()
print 'Connect Statics Database Fail.'
sys.exit(1)
  • 测试代码
# -*- coding: utf-8 -*-
from myconn import MongoConn

if __name__ == "__main__":
my_cOnn= MongoConn()
datas = [
{'_id':1, 'data':12},
{'_id':2, 'data':22},
{'_id':3, 'data':'cc'}
]
#插入数据,'mytest'是上文中创建的表名
my_conn.db['mytest'].insert(datas)
#查询数据,'mytest'是上文中创建的表名
res=my_conn.db['mytest'].find({})
for k in res:
print k
  • Python控制台返回结果:

    这里写图片描述

  • Mongodb中结果:

    这里写图片描述

以上表示测试成功

pymongo 操作

  • 工程中的连接类:和上文的连接类最大的不同是设置单例模式。
    不做介绍,可参考:http://ghostfromheaven.iteye.com/blog/1562618
# -*- coding: utf-8 -*-
import pymongo
import sys
import traceback

MONGODB_COnFIG= {
'host': '127.0.0.1',
'port': 27017,
'db_name': 'xyd',
'username': None,
'password': None
}

class Singleton(object):
# 单例模式写法,参考:http://ghostfromheaven.iteye.com/blog/1562618
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
return cls._instance

class MongoConn(Singleton):
def __init__(self):
# connect db
try:
self.cOnn= pymongo.MongoClient(MONGODB_CONFIG['host'], MONGODB_CONFIG['port'])
self.db = self.conn[MONGODB_CONFIG['db_name']] # connect db
self.username=MONGODB_CONFIG['username']
self.password=MONGODB_CONFIG['password']
if self.username and self.password:
self.cOnnected= self.db.authenticate(self.username, self.password)
else:
self.cOnnected= True
except Exception:
print traceback.format_exc()
print 'Connect Statics Database Fail.'
sys.exit(1)
  • 测试代码
# -*- coding: utf-8 -*-
from myconn import MongoConn
import traceback

def check_connected(conn):
#检查是否连接成功
if not conn.connected:
raise NameError, 'stat:connected Error'

def save(table, value):
# 一次操作一条记录,根据‘_id’是否存在,决定插入或更新记录
try:
my_cOnn= MongoConn()
check_connected(my_conn)
my_conn.db[table].save(value)
except Exception:
print traceback.format_exc()

def insert(table, value):
# 可以使用insert直接一次性向mongoDB插入整个列表,也可以插入单条记录,但是'_id'重复会报错
try:
my_cOnn= MongoConn()
check_connected(my_conn)
my_conn.db[table].insert(value, continue_on_error=True)
except Exception:
print traceback.format_exc()

def update(table, conditions, value, s_upsert=False, s_multi=False):
try:
my_cOnn= MongoConn()
check_connected(my_conn)
my_conn.db[table].update(conditions, value, upsert=s_upsert, multi=s_multi)
except Exception:
print traceback.format_exc()

def upsert_mary(table, datas):
#批量更新插入,根据‘_id’更新或插入多条记录。
#把'_id'值不存在的记录,插入数据库。'_id'值存在,则更新记录。
#如果更新的字段在mongo中不存在,则直接新增一个字段
try:
my_cOnn= MongoConn()
check_connected(my_conn)
bulk = my_conn.db[table].initialize_ordered_bulk_op()
for data in datas:
_id=data['_id']
bulk.find({'_id': _id}).upsert().update({'$set': data})
bulk.execute()
except Exception:
print traceback.format_exc()

def upsert_one(table, data):
#更新插入,根据‘_id’更新一条记录,如果‘_id’的值不存在,则插入一条记录
try:
my_cOnn= MongoConn()
check_connected(my_conn)
query = {'_id': data.get('_id','')}
if not my_conn.db[table].find_one(query):
my_conn.db[table].insert(data)
else:
data.pop('_id') #删除'_id'键
my_conn.db[table].update(query, {'$set': data})
except Exception:
print traceback.format_exc()

def find_one(table, value):
#根据条件进行查询,返回一条记录
try:
my_cOnn= MongoConn()
check_connected(my_conn)
return my_conn.db[table].find_one(value)
except Exception:
print traceback.format_exc()

def find(table, value):
#根据条件进行查询,返回所有记录
try:
my_cOnn= MongoConn()
check_connected(my_conn)
return my_conn.db[table].find(value)
except Exception:
print traceback.format_exc()

def select_colum(table, value, colum):
#查询指定列的所有值
try:
my_cOnn= MongoConn()
check_connected(my_conn)
return my_conn.db[table].find(value, {colum:1})
except Exception:
print traceback.format_exc()

if __name__ == "__main__":
file_path = './enterprise_all.txt'
company_list = []
with open(file_path, "r") as in_file:
for line in in_file:
dic={}
dic['_id']=line.strip()
dic['name']=line.strip()
company_list.append(dic)
upsert_mary('mytest',company_list)

datas = [
{'_id':8, 'data':88},
{'_id':9, 'data':99},
{'_id':36, 'data':3366}
]

#插入,'_id' 的值必须不存在,否则报错
insert('mytest', datas)
#插入
data={'_id':6, 'data':66}
save('mytest',data)
#更新数据
update('mytest',{'_id':8},{'$set':{'data':'888'}}, False, False)
#更新或插入
data={'_id':36, 'data':'dsd'}
upsert_one('mytest',data)
#查找。相对于 select _id from mytest
res=select_colum('mytest',{},'_id')
for k in res:
for key, value in k.iteritems():
print key,":",value
#查找。相对于 select * from mytest
res=find('mytest',{})
for k in res:
for key, value in k.iteritems():
print key,":",value,
print
#查找。相对于 select * from mytest limit 1
res=find_one('mytest',{})
for k in res:
print k,':',res[k]

推荐阅读
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • MySQL 用户创建失败的解决方案
    本文详细介绍了在 MySQL 中遇到用户创建失败问题时的解决方法,包括如何正确配置环境、执行命令以及常见错误排查技巧。通过逐步指导,帮助用户顺利添加和管理 MySQL 用户。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
author-avatar
WYZ的小舟于SZ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有