使用Pymongo 管理MongoDB
一、PyMongo简介
PyMongo是Mongodb的Python接口开发包,是使用Python和Mongodb的推荐方式。本文将对PyMongo的使用进行介绍。
二、安装
PyMongo包含在PythonPackage Index中https://pypi.python.org/pypi/pymongo/。
PyMongo 的安装不需要依赖其他包,但可以通过其他包来扩展应用(参见参考链接)。其安装方式包括一下几种:
I. 使用pip安装:
pip install pymongo 默认安装
pip install pymongo==2.8 安装指定版本
pip install –upgrade pymongo 升级PyMongo
II. 使用easy_install安装:
easy_install pymongo
easy_install –U pymongo
III. 使用源文件进行安装
git clonegit://github.com/mongodb/mongo-python-driver.git pymongo
cd pymongo/
pythonsetup.py install
三、使用简介
1. 使用条件
在使用前需要保证PyMongo安装成功,并且Mongodb已经启动,且下图命令运行成功无报错:
2. 建立与MongoClient连接
连接默认host和port
连接指定host和port
3. 获取数据库 Database
一个Mongodb实例可以支持多个独立的databases。可以通过以下方式获得数据库:
如果数据库名使用属性风格无法通过上述方式获取,可以使用字典风格(dictionary)获取:
4.获取集合(collection)
集合是一组文档,Mongodb中的文档类似于关系数据库中的行,而集合如同表。获取Mongodb集合的方式与获得database的方式相同:
或
5. 文档(documents)操作
I. MongoDB中的数据以JSON格式存储和表示。在PyMongo中,我们使用字典(dictionaries)来表示文档。作为示例,下面的字典为某blog的POST请求:
文档中可以包含原生Python类型(如datetime.dateime),这些会被自动转换至/自相应的BSON类型。
II. 插入文档
Insert_one() 方法可以将一个文档插入一个集合:
文档中如果不包含id字段时,其文档的’_id’字段会自动插入,且该字段需唯一。函数返回InsertOneResult的实例。
当有文档插入后,server才会生成非空的集合posts,我们可以通过列出数据库中所有的集合来验证:
III. find_one() 查找某一文档
在Mongodb中最简单的查找操作就是query_one(),该方法返回一个满足查询条件的文档,当无满足条件文档时返回None。实例如下:
>>> 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']}
结果以dictionary格式返回第一个匹配的文档。
该函数可以支持查找满足必须匹配某元素的文档,示例如下:
>>> 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']}
同时该函数也可以按照文档id查找:
>>> post_id
ObjectId(...)
>>> posts.find_one({"_id":post_id})
{u'date': datetime.datetime(...), u'text': u'My firstblog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb',u'python', u'pymongo']}
IV. 批量插入(insert_many)
insert_many()函数可以接受list格式的参数作为第一参数,进行批量插入操作。该函数会将list中每一个文档都插入数据库中,实例如下:
>>> 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('...')]
V. 同时查询多个文档
find()函数可以用来查询返回多个满足条件的文档。find()函数的返回结果为cursor(游标)对象实例,我们可以通过它来遍历整个匹配结果文档。下例返回了我们之前插入到posts集合中的所有文档:
>>> for postin posts.find():
... post
...
{u'date': datetime.datetime(...), u'text': u'My firstblog 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'}
VI. 查询返回结果数目
查询集合内文档数目:
>>> posts.count()
3
查询集合内满足查询条件的文档数目
>>> posts.find({"author":"Mike"}).count()
2
VII. 高级查询
PyMongo支持许多不同类型的高级查询,例如查询某时间段以前的结果,并按author字段排序:
>>> d= datetime.datetime(2009,11,12, 12)
>>> for postin 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']}
6. 索引
加入索引可以加快查询的速度, 我们可以通过create_index()加入索引,并且可以通过explain()函数查看查询的步骤和过程:
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BasicCursor'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
3
>>> frompymongoimport 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"]
2
可以看到插入索引后,查询的步骤缩短为2步。
四. 参考文献
PyMongo tutorial: http://api.mongodb.org/python/current/tutorial.html
PyMongo API: http://api.mongodb.org/python/current/api/index.html
Python Org: http://www.python.org