现在我们已经描述了MongoDB的是什么,让我们来看看如何在Python中实际使用它。由MongoDB开发者发布的官方驱动程序PyMongo,这里通过一些例子介绍,但你也应该查看完整的文档,因为我们无法面面俱到。
当然第一件事就是安装,最简单的方式就是pip:
pip install pymongo==3.4.0注:有关更全面的指南,请查看文档的安装/升级页面,并按照其中的步骤进行设置
完成设置后,启动的Python控制台并运行以下命令:
>>> import pymongo如果没有提出任何异常就说明安装成功了
建立连接使用MongoClient对象建立连接:
from pymongo import MongoClient client = MongoClient()使用上面的代码片段,将建立连接到默认主机(localhost)和端口(27017)。您还可以指定主机和/或使用端口:
client = MongoClient('localhost', 27017)或者使用MongoURl格式:
client = MongoClient('mongodb://localhost:27017') 访问数据库一旦你有一个连接的MongoClient实例,你可以在Mongo服务器中访问任何数据库。如果要访问一个数据库,你可以当作属性一样访问:
db = client.pymongo_test或者你也可以使用字典形式的访问:
db = client['pymongo_test']如果您的指定数据库已创建,实际上并不重要。通过指定此数据库名称并将数据保存到其中,您将自动创建数据库。
插入文档在数据库中存储数据,就如同调用只是两行代码一样容易。第一行指定你将使用哪个集合。在MongoDB中术语中,一个集合是在数据库中存储在一起的一组文档(相当于SQL的表)。集合和文档类似于SQL表和行。第二行是使用集合插入数据insert_one()的方法:
posts = db.posts post_data = { 'title': 'Python and MongoDB', 'content': 'PyMongo is fun, you guys', 'author': 'Scott' } result = posts.insert_one(post_data) print('One post: {0}'.format(result.inserted_id))我们甚至可以使用insert_one()同时插入很多文档,如果你有很多的文档添加到数据库中,可以使用方法insert_many()。此方法接受一个list参数:
post_1 = { 'title': 'Python and MongoDB', 'content': 'PyMongo is fun, you guys', 'author': 'Scott' } post_2 = { 'title': 'Virtual Environments', 'content': 'Use virtual environments, you guys', 'author': 'Scott' } post_3 = { 'title': 'Learning Python', 'content': 'Learn Python, it is easy', 'author': 'Bill' } new_result = posts.insert_many([post_1, post_2, post_3]) print('Multiple posts: {0}'.format(new_result.inserted_ids))你应该看到类似输出:
One post: 584d947dea542a13e9ec7ae6 Multiple posts: [ ObjectId('584d947dea542a13e9ec7ae7'), ObjectId('584d947dea542a13e9ec7ae8'), ObjectId('584d947dea542a13e9ec7ae9') ]注意: 不要担心,你和上面显示不一样。它们是在插入数据时,由Unix的纪元,机器标识符和其他唯一数据组成的动态标识。
检索文档检索文档可以使用find_one()方法,比如要找到author为Bill的记录:
bills_post = posts.find_one({'author': 'Bill'}) print(bills_post) 运行结果: { 'author': 'Bill', 'title': 'Learning Python', 'content': 'Learn Python, it is easy', '_id': ObjectId('584c4afdea542a766d254241') }您可能已经注意到,这篇文章的ObjectId是设置的_id,这是以后可以使用唯一标识。如果需要查询多条记录可以使用find()方法:
scotts_posts = posts.find({'author': 'Scott'}) print(scotts_posts) 结果: <pymongo.cursor.Cursor object at 0x109852f98>他的主要区别在于文档数据不是作为数组直接返回给我们。相反,我们得到一个游标对象的实例。这Cursor是一个包含相当多的辅助方法,以帮助您处理数据的迭代对象。要获得每个文档,只需遍历结果:
for post in scotts_posts: print(post) 4、MongoEngine虽然PyMongo是非常容易使用,总体上是一个伟大的轮子,但是许多项目使用它都可能太低水平。简而言之,你必须编写很多自己的代码来持续地保存,检索和删除对象。PyMongo之上提供了一个更高的抽象一个库是MongoEngine。MongoEngine是一个对象文档映射器(ODM),它大致相当于一个基于SQL的对象关系映射器(ORM)。MongoEngine提供的抽象是基于类的,所以你创建的所有模型都是类。虽然有相当多的Python的库可以帮助您使用MongoDB,MongoEngine是一个更好的,因为它有一个很好的组合的功能,灵活性和社区支持。
使用pip安装:
pip install mongoengine==0.10.7连接:
from mongoengine import * connect('mongoengine_test', host='localhost', port=27017)
和pymongo不同。MongoEngine需要制定数据库名称。