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 相关文章推荐
pycharm 使用心得(四)显示行号
Jun 05 Python
Django内容增加富文本功能的实例
Oct 17 Python
python实现BackPropagation算法
Dec 14 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
python flask中动态URL规则详解
Nov 22 Python
对python中assert、isinstance的用法详解
Nov 27 Python
Python3.9新特性详解
Oct 10 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 分库分表hash算法
2009/11/12 PHP
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
javascript中Object使用详解
2015/01/26 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
java关于string最常出现的面试题整理
2021/01/18 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
养成教育经验材料
2014/05/26 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
聘任书格式及范文
2015/09/21 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
CSS的calc函数用法小结
2022/06/25 HTML / CSS