教程是pymongo和Mongo的一个简单介绍。看完后应该对Pymongo对Mongo的基本操作认识了。
先决条件
开始之前,安装PyMongo和Mongo。确保在Python交互界面执行import不报错:
>>import pymongo
使用MongoClient进行连接
使用PyMongo的第一步是创建一个 MongoClient运行的mongod 实例。这样做很容易:
>>> from pymongo import MongoClient
>>> client = MongoClient ()
上述代码将连接默认主机和端口。我们还可以明确指定主机和端口,如下所示:
>>> client = MongoClient ('localhost' , 27017 )
或使用MongoDB URI格式:
>>> client = MongoClient ('mongodb:// localhost:27017 /' )
获取数据库
MongoDB的一个实例可以支持多个独立的数据库。当使用PyMongo时,您可以使用实例上的属性样式访问访问MongoClient数据库:
>>> db = client.test_database
如果您的数据库名称使用属性样式访问将无法正常工作(如test-database),则可以使用字典样式访问:
>>> db = client [ 'test-database' ]
获取集合
一个集合是一组存储在MongoDB中的文档,并且可以被认为是大致在关系数据库中的表的当量。在PyMongo中获取集合的工作方式与获取数据库相同:
>>> collection = db.test_collection
或(使用字典样式访问):
>>> collection = db [ 'test-collection' ]
MongoDB中关于集合(和数据库)的一个重要注意事项是,它们是懒惰创建的 - 上述任何命令都没有在MongoDB服务器上实际执行任何操作。当将第一个文档插入时,将创建集合和数据库。
文件
MongoDB中的数据使用JSON样式文档进行表示(并存储)。在PyMongo中,我们使用字典来表示文档。例如,以下字典可能用于表示博客文章:
>>> import datetime
>>> post = {"author": "Mike",
... "text": "My first blog post!",
... "tags": ["mongodb", "python", "pymongo"],
... "date": datetime.datetime.utcnow()}
请注意,文档可以包含本机Python类型(例如 datetime.datetime实例),将自动转换为相应的BSON类型和从相应的BSON类型转换
插入文件
要将文档插入到集合中,我们可以使用以下insert_one()
方法:
>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId('...')
当文档插入特殊键时"_id"
,如果文档尚未包含"_id"
键,则会自动添加。该"_id"
集合的值必须是唯一的。insert_one()
返回一个实例InsertOneResult。有关更多信息"_id"
,请参阅有关_id
的文档。
插入第一个文档后,实际上已经在服务器上创建了帖子集合。我们可以通过列出我们的数据库中的所有集合来验证:
>>> db.collection_names(include_system_collections=False)
[u'posts']
用find_one()获取单个文档
MongoDB中可以执行的最基本的查询类型是 find_one()
。此方法返回与查询匹配的单个文档(或None如果没有匹配项)。当您知道只有一个匹配的文档,或只对第一个匹配项感兴趣时,它是有用的。这里我们 find_one()
用来从帖子集中获取第一个文档:
>>> import pprint
>>> pprint.pprint(posts.find_one())
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
注意 返回的文档包含一个"_id"
自动添加的插入。
find_one()
还支持查询结果文档必须匹配的特定元素。为了将我们的结果限制在作者“Mike”的文档中:
>>> pprint.pprint(posts.find_one({"author": "Mike"}))
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
如果我们尝试使用不同的作者,例如“Eliot”,我们将不会得到结果:
>>> posts.find_one({"author": "Eliot"})
>>>
通过ObjectId查询
我们也可以找到一个post通过_id,在我们的例子中是一个ObjectId:
>>> post_id
ObjectId(...)
>>> pprint.pprint(posts.find_one({"_id": post_id}))
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
请注意,ObjectId与其字符串表示形式不同:
>>> post_id_as_str = str(post_id)
>>> posts.find_one({"_id": post_id_as_str}) # No result
>>>
Web应用程序中的常见任务是从请求URL获取ObjectId并找到匹配的文档。在这种情况下,必须将字符串转换为ObjectId在传递给 find_one()方法之前:
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)})