使用Pymongo 管理MongoDB

使用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已经启动,且下图命令运行成功无报错:

   

>>> import pymongo

2.    建立与MongoClient连接

连接默认host和port

   

>>> from pymongo import MongoClient
>>> client = MongoClient()

连接指定host和port

   

>>> client = MongoClient('localhost', 27017)

3. 获取数据库 Database

一个Mongodb实例可以支持多个独立的databases。可以通过以下方式获得数据库:

   

>>> db = client.test_database

如果数据库名使用属性风格无法通过上述方式获取,可以使用字典风格(dictionary)获取:

   

>>> db = client['test-database']

4.获取集合(collection)

集合是一组文档,Mongodb中的文档类似于关系数据库中的行,而集合如同表。获取Mongodb集合的方式与获得database的方式相同:

   

>>> collection = db.test_collection

   

>>> collection = db['test-collection']

5. 文档(documents)操作

I. MongoDB中的数据以JSON格式存储和表示。在PyMongo中,我们使用字典(dictionaries)来表示文档。作为示例,下面的字典为某blog的POST请求:

   

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

文档中可以包含原生Python类型(如datetime.dateime),这些会被自动转换至/自相应的BSON类型。

II. 插入文档

Insert_one() 方法可以将一个文档插入一个集合:

   

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

文档中如果不包含id字段时,其文档的’_id’字段会自动插入,且该字段需唯一。函数返回InsertOneResult的实例。

当有文档插入后,server才会生成非空的集合posts,我们可以通过列出数据库中所有的集合来验证:

   

>>> db.collection_names(include_system_collections=False)
[u'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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值