python与MongoDB的连接

python与MongoDB的连接_第1张图片

一、配置和安装相应的环境

主要针对python脚本操作mongdb数据库,所以安装pymongo和mongodb库。

二、创建连接到mongodb数据库:

与PyMongo工作时,第一步是建立一个MongoClient到正在运行的mongod实例。

from pymongo import MongoClient
client = MongoClient('localhost', 27017)#比较常用

# client = MongoClient('mongodb://localhost:27017/')使用MongoDB的URI格式

创建常见的方式有两种:一种是连接到默认的主机端口;另外一种是指定主机和固定的端口,注意一般mongodb安装时默认的端口为:27017。

三、创建数据库

MongoDB中的单个实例可以支持多个独立的数据库。当PyMongo工作访问使用上MongoClient实例属性的风格访问数据库:例如创建一个test_database数据库。

db = client.test_database

# db = client['test-database']或者这种形式

#test_database数据库的名称

四、获取集合(getting a collection)

集合是一组存储在MongoDB中的文件,并且可以被认为是一个表,作为大致在关系数据库中的等效的。获得在PyMongo收集工作与获取数据库:

collection = db.test_collection

# collection = db['test-collection']或者这种形式

有关集合(和数据库)在MongoDB中一个重要的注意的是:当第一个文件被插入到他们集合和数据库时集合就被创建。

五、文件

MongoDB中的数据是使用JSON风格的文件代表(和存储)。在PyMongo我们用字典来代表文件。作为一个例子,下面的字典可能被用来代表一个博客帖子,下面以一个例子来说明文件的写入mongodb的过程:

文件的内如如下:

import datetime

post = {"author": "Mike",

..."text":"My first blog post!",

..."tags":["mongodb", "python", "pymongo"],

..."date":datetime.datetime.utcnow()}

Note:请注意,文档可以包含原生的Python类型(如datetime.datetime实例),这些类型的值会被自动在原生类型和BSON格式之间转换。

5.1文件的插入

若要将文档转换为集合,可以使用insert_one()函数进行:

>>> posts = db.posts

>>> post_id = posts.insert_one(post).inserted_id

>>> post_id

Out[5]: ObjectId('56556b3c9d00010b2f8909cf')

当一个文件被插入一个特殊的键,“_id”,自动添加如果文档没有包含一个“_id”键。“_id”的值必须在这个集合是唯一的。insert_one()返回InsertOneResult的一个实例。有关“_id”的更多信息,请参见_id的文档。

插入第一个文档后,该帖收集实际上已在服务器上创建。我们可以通过列出所有在我们的数据库中收集的验证这一点:

>>> db.collection_names(include_system_collections=False)

Out[6]: [u'posts']

5.2单个文档的获取find_one()

在MongoDB中,最基本的查询是find_one。这个方法返回一个符合查询的文件,或者在没有匹配的时候返回None。

当只有一个文件符合条件的时候,或者只对第一个符合条件的文件感兴趣的时候,这个方法是很有用的。
我们用find_one()来获取posts collection 里的第一个文件:

>>> posts.find_one()
{'date': datetime.datetime(2016, 9, 27, 3, 56, 26, 78000), 'author': 'Mike', 
'_id': ObjectId('57e9edea77eddf223cde3314'), 'tags': ['mongodb', 'python', 'pymongo'], 
'text': 'My first blog post!'}

返回结果是一个我们之前插入的符合条件的字典类型值。
注意,返回的文件里包含_id这个键值,这是自动添加的。
find_one()还支持对特定元素进行匹配的查询。限制我们文档的作者是"Mike",可以这么做:

>>> posts.find_one({"author":"Mike"})
{'date': datetime.datetime(2016, 9, 27, 3, 56, 26, 78000), 'author': 'Mike', 
'_id': ObjectId('57e9edea77eddf223cde3314'), 'tags': ['mongodb', 'python', 'pymongo'], 
'text': 'My first blog post!'}

如果我们用不同的作者,比如:"Eliot",将不会得到结果。

>>> posts.find_one({"author":"Eliot"})
>>>

5.3 通过ObjectId查询

通过_id也可以进行查询,在例子中就是ObjectId:

 >>> post_id
 ObjectId('57eb54a877eddf292cbea0a8')
 >>> posts.find_one({"_id": post_id})
{'date': datetime.datetime(2016, 9, 28, 5, 25, 53, 6000), 'author': 'Mike', 
'_id': ObjectId('57eb54a877eddf292cbea0a8'), 'tags': ['mongodb', 'python'], 
'text': 'My first blog post!'}

注意:ObjectId 并不等同于它的字符串形式。

>>> post_id_as_str = str(post_id)
>>> posts.find_one({"_id": post_id_as_str}) #No result
>>> 

在web应用的一个常见任务就是在request的URL里获取ObjectId,然后找到与之匹配的文件。
在本例中,必须要先从字符串转换为ObjectId,然后传给find_one:

>>> from bson.objectid import ObjectId
#从URL里获取post_id,然后把它作为字符串传入
>>> def get(post_id):
       #将字符串转换为ObjectId
       document = client.db.collection.find_one({"_id": ObjectId(post_id)})

小插曲:
MongoDB以BSON格式保存数据。BSON字符串都是UTF-8编码的,所以pymongo必须确保它保存的字符串值
包含有效地UTF-8数据.常规字符串()都是有效的,可以不改变直接保存。
Unicode字符串()就需要先编码成UTF-8格式。

5.4 批量插入(Bulk Inserts)

为了让查询更有趣,我们多插入几个文件。除了单个文件插入,也可以通过给insert_many()方法传入一个列表(list),作为该方法的第一个参数,进行批量插入操作。这将会插入列表(list)中的每个文件(document)到集合中去,而且只向server发送一条命令:

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('57eb700b77eddf292cbea0a9'), ObjectId('57eb700b77eddf292cbea0aa')] 

这个例子里有一些比较有趣的地方:
insert_many()现在返回两个ObjectId实例,每个代表一个插入的文件。
new_posts[1]与其他的posts内容格式不相同,里面没有"tags”。另外我们增加了一个新的“title”域。这就是MongoDB所提到的无schema特点。

5.5 多文档查询

为了得到更多的文件,我们使用find()方法。find()返回一个Cursor实例,可使我们遍历所有匹配的文件。
比如遍历每个posts collection里的文件:

>>> for post in posts.find():
post

与使用find_one()时候相同,可以传入一个文件来限制查询结果。比如查询作者"Mike" 文件:

>>> for post in posts.find({"author":"Mike"}):
post

5.6 范围查询

MongoDB的支持许多不同类型的高级查询。作为一个例子,执行我们结果限制的位置早于某个日期,也由作者对结果进行排序的查询:

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'andpretty easy too!', u'_id': ObjectId('565589029d00010c0ad19cd8'), u'author':u'Eliot', u'title': u'MongoDB is fun'}

{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Anotherpost', u'_id': ObjectId('565589029d00010c0ad19cd7'), u'author': u'Mike',u'tags': [u'bulk', u'insert']}

六、简单的统计

如果我们只是想知道有多少文件匹配,我们可以执行查询函数count()。得到所有集合中的文件的计数:

posts.count()

结果:

3

或者那些符合特定格式的文件:

posts.find({"author": "Mike"}).count()

结果:

2

七、删除文档

可以使用集合的remove()方法从集合中删除一个文档。remove方法和find、find_one一样,也可以使用一个字典参数来指定哪个文档需要被删除。比如,要删除所有"author"键的值为"Mike"的文档,输入:

>>>posts.remove({"author": "Mike"})
{u'n': 4, u'ok': 1}

>>>for nl in posts.find():
    print nl

{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('565589029d00010c0ad19cd8'), u'author':u'Eliot', u'title': u'MongoDB is fun'}

{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('56559fb89d00010d55ba1d12'), u'author':u'Eliot', u'title': u'MongoDB is fun'}

八、案例解析

8.1 常见mongoDB函数的创建集成案例

python与MongoDB的连接_第2张图片
python与MongoDB的连接_第3张图片
python与MongoDB的连接_第4张图片
python与MongoDB的连接_第5张图片
python与MongoDB的连接_第6张图片

8.2 将10条信息写入mongdb数据库的案例

python与MongoDB的连接_第7张图片
python与MongoDB的连接_第8张图片

你可能感兴趣的:(python与MongoDB的连接)