热门标签 | 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]

推荐阅读
  • NetCat,因其强大的多功能性和灵活性,被网络安全领域的专业人士誉为‘瑞士军刀’。本文将详细介绍NetCat的功能、应用场景及其在不同平台上的使用方法。 ... [详细]
  • 使用 NDB 提升 Node.js 应用调试体验
    本文介绍了由 Google Chrome 实验室推出的新一代 Node.js 调试工具 NDB,旨在为开发者提供更加高效和便捷的调试解决方案。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • Smali代码动态调试指南
    本文介绍了如何通过一系列具体步骤实现Smali代码的动态调试,包括环境搭建、工具安装及调试过程中的关键操作。 ... [详细]
  • MySQL 5.7 绿色版安装及 my.ini 配置详解
    本文主要针对最近因系统重装导致的MySQL配置问题,详细介绍了MySQL 5.7.24绿色解压版的安装步骤及my.ini配置文件的关键设置,帮助用户顺利完成数据库的安装与配置。 ... [详细]
  • 本文介绍如何配置SQL Server以实现数据库的远程备份,包括建立网络映射、执行备份操作以及自动化的备份任务设置。 ... [详细]
  • Windows 系统中 Flutter 与 IntelliJ IDEA 的环境配置指南
    本指南详细介绍了如何在 Windows 操作系统上设置 Flutter 开发环境,并集成至 IntelliJ IDEA 中,适合初学者及专业人士参考。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 使用 Docker 部署 MongoDB 并通过 IntelliJ IDEA 远程访问
    本文详细介绍了如何使用 Docker 部署 MongoDB,并通过 IntelliJ IDEA 实现远程连接的方法。包括 MongoDB 的基本配置、用户管理以及如何在 IDE 中配置连接。 ... [详细]
  • Shiro功能拓展:登录失败重试次数限制
    本文详细介绍了如何在Apache Shiro框架中实现对用户登录失败重试次数的限制,通过自定义密码匹配器来增强系统的安全性。该方法不仅能够有效防止暴力破解攻击,还能确保合法用户的账户安全。 ... [详细]
  • 本文探讨了为何采用RESTful架构及其优势,特别是在现代Web应用开发中的重要性。通过前后端分离和统一接口设计,RESTful API能够提高开发效率,支持多种客户端,并简化维护。 ... [详细]
  • 本文详细介绍了C++标准模板库(STL)中各容器的功能特性,并深入探讨了不同容器操作函数的异常安全性。 ... [详细]
  • Xcode 快捷键与实用技巧
    在iOS开发过程中,熟练掌握Xcode的快捷键可以显著提升工作效率,减少不必要的鼠标操作,让开发者更加专注于代码编写。本文将介绍一些常用的Xcode快捷键及技巧,帮助开发者提高开发效率。 ... [详细]
  • 探索PWA H5 Web App优化之路(Service Worker与Lighthouse的应用)
    本文探讨了如何通过Service Worker和Lighthouse工具来优化PWA H5 Web App,旨在提升用户体验,包括提高加载速度、增强离线访问能力等方面。 ... [详细]
  • Pikachu平台SQL注入漏洞详解
    本文详细介绍了SQL注入漏洞的基本原理、攻击流程、不同类型注入点的识别与利用方法,以及基于union联合查询、报错信息、布尔盲注、时间盲注等多种技术手段的信息获取方式。同时,探讨了如何通过SQL注入获取操作系统权限,以及HTTP Header注入和宽字节注入等高级技巧。最后,提供了使用SQLMap自动化工具进行漏洞测试的方法和常见的SQL注入防御措施。 ... [详细]
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社区 版权所有