08 pymongo

pymongo

安裝

pip install pymongo

鏈接MongoDB

import pymongo


# 鏈接MongoDB
client = pymongo.MongoClient(host='localhost', port=27017)
# client = pymongo.MongoClient('mongodb://localhost:27017/')  # 此方式也能夠


# 指定數據庫
db = client.test
# db = client['test']  # 此方式也能夠


# 指定集合
collection = db.students
# collection = db['students']  # 此方式也能夠

集合操做

    官方文檔html

添加

1 insertpython

    在MongoDB中,每條數據其實都有一個_id屬性來惟一標識,若是沒有顯式指明_id,MongoDB會自動產生一個ObjectId類型的_id屬性。mongodb

    insert()方法執行後返回_id值數據庫

student = {
    'id': '20170101',
    'name': 'ethan1',
    'age': 20,
    'gender': 'male'
}
result = collection.insert(student)
print(result)  # 5c806e95ebdaee2a304fbf78

student1 = {
    'id': '20170101',
    'name': 'ethan2',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'ethan3',
    'age': 21,
    'gender': 'male'
}

result = collection.insert([student1, student2])
print(result)  # [ObjectId('5c806f69ebdaee2ac019041f'), ObjectId('5c806f69ebdaee2ac0190420')]

2 insert_one&insert_manyapi

    在pymongo 3.X版本中,insert()方法官方已經不推薦使用了,固然繼續使用也沒有什麼問題。spa

    官方推薦使用insert_one()和insert_many()方法將插入單條和多條記錄分開。code

    insert_one()返回結果與insert()不一樣,這次返回的是InsertOneResult對象,調用其inserted_id屬性獲取_id,inert_many()返回的是InsertManyResult對象,調用inserted_ids屬性獲取_id列表。htm

# insert_one
student = {
    'id': '20170101',
    'name': 'ethan4',
    'age': 20,
    'gender': 'male'
}

result = collection.insert_one(student)
print(result)  # <pymongo.results.InsertOneResult object at 0x000001C4A65A9C48>
print(result.inserted_id)  # 5c8071f5ebdaee2e205a6129


# insert_many
student1 = {
    'id': '20170101',
    'name': 'ethan5',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'ethan6',
    'age': 21,
    'gender': 'male'
}

result = collection.insert_many([student1, student2])
print(result)  # <pymongo.results.InsertManyResult object at 0x0000026F6865ACC8>
print(result.inserted_ids)  # [ObjectId('5c807236ebdaee2568d6fabc'), ObjectId('5c807236ebdaee2568d6fabd')]

查詢

    官方文檔對象

1 find_oneblog

    find_one()查詢獲得的是單個結果,返回類型爲字典類型。

    也可根據ObjectId來查詢,查詢結果依然是字典類型。若是查詢_id不存在則返回None

result = collection.find_one({'name': 'ethan4'})
print(type(result))  # <class 'dict'>
print(result)  # {'_id': ObjectId('5c8071f5ebdaee2e205a6129'), 'id': '20170101', 'name': 'ethan4', 'age': 20, 'gender': 'male'}

from bson.objectid import ObjectId

result = collection.find_one({'_id': ObjectId('5c8071f5ebdaee2e205a6129')})
print(result)  # {'_id': ObjectId('5c8071f5ebdaee2e205a6129'), 'id': '20170101', 'name': 'ethan4', 'age': 20, 'gender': 'male'}

2 find

    查詢多條數據,返回多個結果。返回結果爲Cursor類型,至關於一個生成器,須要遍歷取到全部結果,每個結果都是字典類型。

查詢年齡爲20的數據
results = collection.find({'age': 20})
print(results)  # <pymongo.cursor.Cursor object at 0x000002511CFA3860>  至關於生成器
for result in results:
    print(result)

查詢年齡大於20的數據
results = collection.find({"age": {"$gt": 20}})

# 在這裏將比較符號概括以下表:
"""
符號含義示例
$lt小於{'age': {'$lt': 20}}
$gt大於{'age': {'$gt': 20}}
$lte小於等於{'age': {'$lte': 20}}
$gte大於等於{'age': {'$gte': 20}}
$ne不等於{'age': {'$ne': 20}}
$in在範圍內{'age': {'$in': [20, 23]}}
$nin不在範圍內{'age': {'$nin': [20, 23]}}
"""

正則匹配查詢
results = collection.find({"name": {"regex": '^e.*'}})

"""
符號含義示例示例含義
$regex匹配正則{'name': {'$regex': '^e.*'}}name以M開頭
$exists屬性是否存在{'name': {'$exists': True}}name屬性存在
$type類型判斷{'age': {'$type': 'int'}}age的類型爲int
$mod數字模操做{'age': {'$mod': [5, 0]}}年齡模5餘0
$text文本查詢{'$text': {'$search': 'ethan'}}text類型的屬性中包含ethan字符串
$where高級條件查詢{'$where': 'obj.fans_count == obj.follows_count'}自身粉絲數等於關注數
"""

計數
count = collection.find().count()
count = collection.find({"age": 20}).count()


排序
results = collection.find().sort("name", pymongo.ASCENDING)

# 偏移, 例偏移2,就忽略前2個元素,獲得第三個及之後的元素
results = collection.find().sort("name", pymongo.ASCENDING).skip(2)

# limit 指定要取的結果個數
results = collection.find().sort("name", pymongo.ASCENDING).skip(2).limit(2)

    值得注意的是,在數據庫數量很是寵大的時候,如千萬、億級別,最好不要使用大的偏移量來查詢數據,極可能會致使內存溢出。可使用相似find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}}) 這樣的方法來查詢,記錄好上次查詢的_id。

更新

1 update

    返回結果爲字典形式,ok即代碼執行成功,nModified表明影響的數據條數

condition = {'name': 'ethan5'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)  #{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

2 update_one

    update()方法其實也是官網不推薦使用的方法。官方推薦使用update_one()和update_many()。用法更嚴格,第二個參數須要使用$類型操做符做爲字典的鍵名。

    其返回結果是UpdateResult類型,而後調用matched_count和modified_count屬性分別得到匹配的數據條數和影響的數據條數

condition = {'name': 'ethan5'}
student = collection.find_one(condition)
student['age'] = 26
result = collection.update_one(condition, {"$set": student})
print(result)  # <pymongo.results.UpdateResult object at 0x0000029E51C4BBC8>
print(result.matched_count, result.modified_count)  # 1 0

# 指定查詢條件爲年齡大於20,更新條件爲{'$inc': {'age': 1}},執行以後會講第一條符合條件的數據年齡加1。
condition = {'age': {"$gt": 20}}
result = collection.update_one(condition, {"$inc": {'age': 1}})
print(result)  # <pymongo.results.UpdateResult object at 0x0000020075E2BBC8>
print(result.matched_count, result.modified_count)  # 1 1

3 update_many

    update_many()方法會將全部符合條件的數據都更新。

condition = {'age': {"$gt": 20}}
result = collection.update_many(condition, {"$inc": {'age': 1}})
print(result)  #<pymongo.results.UpdateResult object at 0x000002076EA4BBC8>
print(result.matched_count, result.modified_count)  # 3 3

刪除 

1 remove

    符合條件的全部數據均會被刪除。

result = collection.remove({'name': 'ethan5'})
print(result)  # {'n': 1, 'ok': 1.0}

2 delete_one&delete_many

result = collection.remove({'name': 'ethan5'})
print(result)  # {'n': 1, 'ok': 1.0}
result = collection.delete_one({'name': 'ethan6'})
print(result)  # <pymongo.results.DeleteResult object at 0x00000212BF56CC08>
print(result.deleted_count)  # 1

result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)  # 4

其它

    另外,pymongo還提供了一些組合方法,如find_one_and_delete()、find_one_and_replace()、find_one_and_update(),即查找後刪除、替換和更新操做。

    對索引進行操做,如create_index()、create_indexes()、drop_index()等,詳情見官方文檔

相關文章
相關標籤/搜索