Python的MongoDB模块PyMongo操作方法集锦


Posted in Python onJanuary 05, 2016

开始之前当然要导入模块啦:

>>> import pymongo

下一步,必须本地mongodb服务器的安装和启动已经完成,才能继续下去。

建立于MongoClient 的连接:

client = MongoClient('localhost', 27017)
# 或者
client = MongoClient('mongodb://localhost:27017/')

得到数据库:

>>> db = client.test_database
# 或者
>>> db = client['test-database']

得到一个数据集合:

collection = db.test_collection
# 或者
collection = db['test-collection']

MongoDB中的数据使用的是类似Json风格的文档:

>>> import datetime
>>> post = {"author": "Mike",
...     "text": "My first blog post!",
...     "tags": ["mongodb", "python", "pymongo"],
...     "date": datetime.datetime.utcnow()}

插入一个文档:

>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId('...')

找一条数据:

>>> posts.find_one()
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

>>> posts.find_one({"author": "Mike"})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

>>> posts.find_one({"author": "Eliot"})
>>>

通过ObjectId来查找:

>>> post_id
ObjectId(...)
>>> posts.find_one({"_id": post_id})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

不要转化ObjectId的类型为String:

>>> post_id_as_str = str(post_id)
>>> posts.find_one({"_id": post_id_as_str}) # No result
>>>

如果你有一个post_id字符串,怎么办呢?

from bson.objectid import ObjectId

# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
  # Convert from string to ObjectId:
  document = client.db.collection.find_one({'_id': ObjectId(post_id)})

多条插入:

>>> new_posts = [{"author": "Mike",
...        "text": "Another post!",
...        "tags": ["bulk", "insert"],
...        "date": datetime.datetime(2009, 11, 12, 11, 14)},
...       {"author": "Eliot",
...        "title": "MongoDB is fun",
...        "text": "and pretty easy too!",
...        "date": datetime.datetime(2009, 11, 10, 10, 45)}]
>>> result = posts.insert_many(new_posts)
>>> result.inserted_ids
[ObjectId('...'), ObjectId('...')]

查找多条数据:

>>> for post in posts.find():
...  post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}

当然也可以约束查找条件:

>>> for post in posts.find({"author": "Mike"}):
...  post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

获取集合的数据条数:

>>> posts.count()

或者说满足某种查找条件的数据条数:

>>> posts.find({"author": "Mike"}).count()

范围查找,比如说时间范围:

>>> d = datetime.datetime(2009, 11, 12, 12)
>>> for post in posts.find({"date": {"$lt": d}}).sort("author"):
...  print post
...
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

$lt是小于的意思。

如何建立索引呢?比如说下面这个查找:

>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BasicCursor'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]

建立索引:

>>> from pymongo import ASCENDING, DESCENDING
>>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
u'date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BtreeCursor date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]

连接聚集

>>> account = db.Account
#或 
>>> account = db["Account"]

 

查看全部聚集名称

>>> db.collection_names()

 

查看聚集的一条记录

>>> db.Account.find_one()
 

>>> db.Account.find_one({"UserName":"keyword"})

 

查看聚集的字段

>>> db.Account.find_one({},{"UserName":1,"Email":1})
{u'UserName': u'libing', u'_id': ObjectId('4ded95c3b7780a774a099b7c'), u'Email': u'libing@35.cn'}
 

>>> db.Account.find_one({},{"UserName":1,"Email":1,"_id":0})
{u'UserName': u'libing', u'Email': u'libing@35.cn'}

 

查看聚集的多条记录

>>> for item in db.Account.find():
    item
 

>>> for item in db.Account.find({"UserName":"libing"}):
    item["UserName"]

 

查看聚集的记录统计

>>> db.Account.find().count()
 

>>> db.Account.find({"UserName":"keyword"}).count()

 

聚集查询结果排序

>>> db.Account.find().sort("UserName") #默认为升序
>>> db.Account.find().sort("UserName",pymongo.ASCENDING)  #升序
>>> db.Account.find().sort("UserName",pymongo.DESCENDING) #降序

 

聚集查询结果多列排序

>>> db.Account.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])

 

添加记录

>>> db.Account.insert({"AccountID":21,"UserName":"libing"})

 

修改记录

>>> db.Account.update({"UserName":"libing"},{"$set":{"Email":"libing@126.com","Password":"123"}})

 

删除记录

>>> db.Account.remove()  -- 全部删除
 

>>> db.Test.remove({"UserName":"keyword"})
Python 相关文章推荐
Python实现统计单词出现的个数
May 28 Python
python获取各操作系统硬件信息的方法
Jun 03 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
django的csrf实现过程详解
Jul 26 Python
使用python模拟命令行终端的示例
Aug 13 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
Numpy数组的广播机制的实现
Nov 03 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
Python之matplotlib绘制折线图
Apr 13 Python
使用Python神器对付12306变态验证码
Jan 05 #Python
Python聊天室实例程序分享
Jan 05 #Python
详解Python Socket网络编程
Jan 05 #Python
菜鸟使用python实现正则检测密码合法性
Jan 05 #Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 #Python
Python实现控制台进度条功能
Jan 04 #Python
python实现网站的模拟登录
Jan 04 #Python
You might like
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP数据缓存技术
2007/02/14 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php 启动报错如何解决
2014/01/17 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
采用call方式实现js继承
2014/05/20 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python tkinter实现屏保程序
2019/07/30 Python
在django中,关于session的通用设置方法
2019/08/06 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Python实现括号匹配方法详解
2020/02/10 Python
keras 权重保存和权重载入方式
2020/05/21 Python
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
2014年超市员工工作总结
2014/11/18 职场文书
介绍信范文
2015/01/31 职场文书
老员工辞职信范文
2015/05/12 职场文书
Python绘制分类图的方法
2021/04/20 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android