pymongo是Python中用來操做MongoDB的一個庫。而MongoDB是一個基於分佈式文件存儲的數據庫,其文件存儲格式相似於JSON,叫BSON.html
使用pymongo的第一步是建立一個MongoClient來運行mongodb實例python
from pymongo import MongoClient
Client = MongoClient()
複製代碼
一個MongoDB實例能夠支持多個獨立的數據庫。 使用PyMongo時,能夠使用MongoClient實例上的屬性來訪問數據庫,也能夠使用字典的方式訪問.mongodb
db = client.test_database
db = client['test-database']
複製代碼
集合是一組存儲在MongoDB中的document,能夠被認爲與關係數據庫中的表格大體至關。 在PyMongo中獲取集合與獲取數據庫的工做方式相同:數據庫
collection = db.test_collection
collection = db['test-collection']
複製代碼
MongoDB中的Collection是惰性建立的, 上述命令並無在MongoDB服務器上執行任何操做.Collection和數據是在第一個document被插入時建立的.api
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中插入多個文檔post
>>> 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中替換一個文檔spa
>>> 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選項插入新文檔:code
>>> 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請移步官方文檔