pymongo 介绍和使用示例

背景

最近项目中用到了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 操作

# -*- 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]
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值