PyMongo 基礎使用指南

白夜發表於2017-12-20

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
複製程式碼

查詢文件

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請移步官方文件

相關文章