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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
python中urllib模块用法实例详解
Nov 19 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
python分布式环境下的限流器的示例
Oct 26 Python
Python变量访问权限控制详解
Jun 29 Python
python数组循环处理方法
Aug 26 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
Python wordcloud库安装方法总结
Dec 31 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
Python制作表白爱心合集
Jan 22 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
加强版phplib的DB类
2008/03/31 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
几种tab切换详解
2017/02/03 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
Python 如何提高元组的可读性
2019/08/26 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
给学校的建议书
2014/03/12 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
Golang 入门 之url 包
2022/05/04 Golang