pip install pymongo
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()等,詳情見官方文檔