PyMongo 基礎使用指南

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']
複製代碼

獲取Collection

集合是一組存儲在MongoDB中的document,能夠被認爲與關係數據庫中的表格大體至關。 在PyMongo中獲取集合與獲取數據庫的工做方式相同:數據庫

collection = db.test_collection
collection = db['test-collection']
複製代碼

MongoDB中的Collection是惰性建立的, 上述命令並無在MongoDB服務器上執行任何操做.Collection和數據是在第一個document被插入時建立的.api

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中插入多個文檔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
複製代碼

查詢文檔

find()

db.test.find({"hello": "world"})
複製代碼

只匹配具備值「world」的關鍵字「hello」的文檔。若是任何參數的類型不正確,則引起TypeError。 返回與此查詢相對應的Cursor實例。

find_one()

查詢單個文檔

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_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}
複製代碼

find_one_and_update()

查找單個文檔並進行更新,返回原始文檔或更新的文檔。

>>> 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}}
複製代碼

統計

count()

獲取集合中文檔的數量.

最後

更多PyMongo API請移步官方文檔

相關文章
相關標籤/搜索