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搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
django 发送手机验证码的示例代码
Apr 25 Python
opencv python 2D直方图的示例代码
Jul 20 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 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
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
php经典算法集锦
2015/11/14 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python批量下载图片的三种方法
2013/04/22 Python
python计算文本文件行数的方法
2015/07/06 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
python Opencv将图片转为字符画
2021/02/19 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
python处理写入数据代码讲解
2020/10/22 Python
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
计算机网络专业自荐书
2014/06/09 职场文书
应届生找工作求职信
2014/06/24 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
MySQL慢查询的坑
2021/04/28 MySQL
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android