pymongo是Python中用来操作MongoDB的一个库。而MongoDB是一个基于分布式文件存储的数据库,其文件存储格式类似于JSON,叫BSON.
连接数据库
使用pymongo的第一步是创建一个MongoClient来运行mongodb实例
from pymongo import MongoClient
Client = MongoClient()
复制代码
获取数据库
一个MongoDB实例可以支持多个独立的数据库。 使用PyMongo时,可以使用MongoClient实例上的属性来访问数据库,也可以使用字典的方式访问.
db = client.test_database
db = client['test-database']
复制代码
获取Collection
集合是一组存储在MongoDB中的document,可以被认为与关系数据库中的表格大致相当。 在PyMongo中获取集合与获取数据库的工作方式相同:
collection = db.test_collection
collection = db['test-collection']
复制代码
MongoDB中的Collection是惰性创建的, 上述命令并没有在MongoDB服务器上执行任何操作.Collection和数据是在第一个document被插入时创建的.
documents
MongoDB使用JSON风格的文档来表示(并存储)数据.在pymongo中,使用字典来表示文档:
post = {
"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()
}
复制代码
插入文档
使用insert_one()
方法在Collection中插入一个文档
>>> db.test.count({'x': 1})
0
>>> result = db.test.insert_one({'x': 1})
>>> result.inserted_id
ObjectId('54f112defba522406c9cc208')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f112defba522406c9cc208')}
复制代码
使用insert_many()
方法在Collection中插入多个文档
>>> db.test.count()
0
>>> result = db.test.insert_many([{'x': i} for i in range(2)])
>>> result.inserted_ids
[ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')]
>>> db.test.count()
2
复制代码
更新文档
使用replace_one()
方法在Collection中替换一个文档
>>> for doc in db.test.find({}):
... print(doc)
...
{u'x': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
>>> result = db.test.replace_one({'x': 1}, {'y': 1})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find({}):
... print(doc)
...
{u'y': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
复制代码
如果匹配的文档不存在,可以使用upsert选项插入新文档:
>>> result = db.test.replace_one({'x': 1}, {'x': 1}, True)
>>> result.matched_count
0
>>> result.modified_count
0
>>> result.upserted_id
ObjectId('54f11e5c8891e756a6e1abd4')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f11e5c8891e756a6e1abd4')}
复制代码
使用update_one()
方法在Collection中更新一个文档
>>> for doc in db.test.find():
... print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_one({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find():
... print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
复制代码
使用update_many()
方法在Collection中更新多个文档
>>> for doc in db.test.find():
... print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_many({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
3
>>> result.modified_count
3
>>> for doc in db.test.find():
... print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 4, u'_id': 1}
{u'x': 4, u'_id': 2}
复制代码
删除文档
使用delete_one()
方法在Collection中删除一个文档
>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_one({'x': 1})
>>> result.deleted_count
1
>>> db.test.count({'x': 1})
2
复制代码
使用delete_many()
方法在Collection中删除多个文档
>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_many({'x': 1})
>>> result.deleted_count
3
>>> db.test.count({'x': 1})
0
复制代码
查询文档
db.test.find({"hello": "world"})
复制代码
只匹配具有值“world”的关键字“hello”的文档。如果任何参数的类型不正确,则引发TypeError。 返回与此查询相对应的Cursor实例。
查询单个文档
find_one_and_delete()
查询单个文档并删除它,返回文档。
>>> db.test.count({'x': 1})
2
>>> db.test.find_one_and_delete({'x': 1})
{u'x': 1, u'_id': ObjectId('54f4e12bfba5220aa4d6dee8')}
>>> db.test.count({'x': 1})
1
复制代码
如果查询结果有多个,则可以使用排序, 删除排序后的第一个
>>> for doc in db.test.find({'x': 1}):
... print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_delete(
... {'x': 1}, sort=[('_id', pymongo.DESCENDING)])
{u'x': 1, u'_id': 2}
复制代码
查询单个文档并替换. 返回原始的文档或替换的文档. find_one_and_replace()
方法与find_one_and_update()
方法不同,只是替换过滤器匹配的文档,而不是修改现有的文档。
>>> for doc in db.test.find({}):
... print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_replace({'x': 1}, {'y': 1})
{u'x': 1, u'_id': 0}
>>> for doc in db.test.find({}):
... print(doc)
...
{u'y': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
复制代码
查找单个文档并进行更新,返回原始文档或更新的文档。
>>> db.test.find_one_and_update(
... {'_id': 665}, {'$inc': {'count': 1}, '$set': {'done': True}})
{u'_id': 665, u'done': False, u'count': 25}}
复制代码
默认情况下, find_one_and_update()
返回更新之前的文档.要返回更新之后的文档,需设置return_docuemnt
参数.
>>> from pymongo import ReturnDocument
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... return_document=ReturnDocument.AFTER)
{u'_id': u'userid', u'seq': 1}
复制代码
可以限制返回的字段
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... return_document=ReturnDocument.AFTER)
{u'seq': 2}
复制代码
如果文档不存在, 可以使用upsert
参数来创建文档
>>> db.example.delete_many({}).deleted_count
1
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... upsert=True,
... return_document=ReturnDocument.AFTER)
{u'seq': 1}
复制代码
如果查询结果有多个,则可以使用排序, 更新排序后的第一个
>>> for doc in db.test.find({'done': True}):
... print(doc)
...
{u'_id': 665, u'done': True, u'result': {u'count': 26}}
{u'_id': 701, u'done': True, u'result': {u'count': 17}}
>>> db.test.find_one_and_update(
... {'done': True},
... {'$set': {'final': True}},
... sort=[('_id', pymongo.DESCENDING)])
{u'_id': 701, u'done': True, u'result': {u'count': 17}}
复制代码
统计
获取集合中文档的数量.
最后
更多PyMongo API请移步官方文档