淺析Python與Mongodb數(shù)據(jù)庫(kù)之間的操作方法
MongoDB 是目前最流行的 NoSQL 數(shù)據(jù)庫(kù)之一,使用的數(shù)據(jù)類型 BSON(類似 JSON)。
1. 安裝Mongodb和pymongo
Mongodb的安裝和配置
Mongodb的安裝教程請(qǐng)網(wǎng)上搜索, 安裝完成后, 進(jìn)行以下配置過(guò)程:
1.1 創(chuàng)建目錄, 該目錄為Mongodb數(shù)據(jù)文件的存放目錄:
*注: 本人使用的不是root用戶, 所以修改目錄的擁有者. *
sudo mkdir /data sudo chown -R python:python /data mkdir /data/db
1.2 分別執(zhí)行命令:
第一條命令為指定端口和保存路徑, 第二條為運(yùn)行mongodb數(shù)據(jù)庫(kù).
mongod --port 27017 --dbpath /data/db mongo --port 27017
1.3 安裝pymongo
sudo pip3 install pymongo
2. 連接數(shù)據(jù)庫(kù)、指定數(shù)據(jù)庫(kù)、指定集合、插入數(shù)據(jù):
mongodb存儲(chǔ)數(shù)據(jù)以鍵值形式, 因此在Python中使用字段插入數(shù)據(jù).
import pymongo
#連接mongodb
client = pymongo.MongoClient('mongodb://localhost:27017/')
#指定數(shù)據(jù)庫(kù)
db = client.test4
#指定集合
collection = db.students
#數(shù)據(jù)
student1 = {
'id': '201801',
'name': 'Jack',
'age': 20,
'gender': 'male'
}
student2 = {
'id': '201802',
'name': 'Tom',
'age': 22,
'gender': 'male'
}
student3 = {
'id': '201803',
'name': 'Rose',
'age': 21,
'gender': 'female'
}
student4 = {
'id': '201804',
'name': 'Mike',
'age': 20,
'gender': 'female'
}
student5 = {
'id': '201805',
'name': 'Ray',
'age': 20,
'gender': 'female'
}
student6 = {
'id': '201806',
'name': 'Alan',
'age': 21,
'gender': 'male'
}
#插入一條數(shù)據(jù)
result1 = collection.insert_one(student1)
print(result1)
print(result1.inserted_id)
# #插入多條數(shù)據(jù)
result2 = collection.insert_many([student2, student3, student4, student5, student6])
print(result2)
print(result2.inserted_ids)
運(yùn)行結(jié)果:
insert方法:
5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'), ObjectId('5b3a1942971951218d41c02d')]
官方推薦:
<pymongo.results.InsertOneResult object at 0x7fa4cc363ec8>
5b3a1942971951218d41c02e
<pymongo.results.InsertManyResult object at 0x7fa4cc363f08>
[ObjectId('5b3a1942971951218d41c02f'), ObjectId('5b3a1942971951218d41c030')]
3. 查詢、計(jì)數(shù)、排序、偏移:
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#查詢一條數(shù)據(jù)
print('單條數(shù)據(jù)','='*50)
result = collection.find_one({'name': 'Jack'})
print(result)
print('多條數(shù)據(jù)','='*50)
#查詢多條數(shù)據(jù)
for res in collection.find({'age': {'$mod': [5, 0]}}):
print(res)
#計(jì)數(shù)
print('計(jì)數(shù)','='*50)
count = collection.find({'age': {'$mod': [5, 0]}}).count()
print(count)
#排序
print('排序','='*50)
results = collection.find().sort('name', pymongo.ASCENDING) #升序, pymongo.DESCENDING為降序
print([result['name'] for result in results])
#偏移
print('偏移','='*50)
results = collection.find().sort('name', pymongo.ASCENDING).skip(2) #偏移2位,忽略前兩個(gè)數(shù)據(jù)
print([result['name'] for result in results])
results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) #只輸出2個(gè)數(shù)據(jù)
print([result['name'] for result in results])
find({‘a(chǎn)ge': {'$mod': [5, 0]}}): 表示查找年齡取余5余0的值. 還有很多比較符號(hào), 請(qǐng)百度.
運(yùn)行結(jié)果:
單條數(shù)據(jù) ==================================================
{'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
多條數(shù)據(jù) ==================================================
{'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5b3a1942971951218d41c02e'), 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}
{'_id': ObjectId('5b3a1942971951218d41c02f'), 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}
計(jì)數(shù) ==================================================
3
排序 ==================================================
['Alan', 'Jack', 'Mike', 'Ray', 'Rose', 'Tom']
偏移 ==================================================
['Mike', 'Ray', 'Rose', 'Tom']
['Mike', 'Ray']
4. 更新:
4.1 不使用$set更新數(shù)據(jù):
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#修改
condition = {'name': 'Jack'}
student = collection.find_one(condition) #獲得滿足condition的數(shù)據(jù)
print('更新前: ', student)
student['age'] = 22 #修改年齡
result = collection.update(condition, student) #將修改后的student替換condition
print('更新后', collection.find_one(condition))
#更新的返回值
print(result) #ok=1代表執(zhí)行成功, nModified代表影響的條數(shù)
運(yùn)行結(jié)果:
更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
4.2 使用$set更新數(shù)據(jù):
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#使用$set更新
condition = {'name': 'Jack'}
student = collection.find_one(condition) #獲得滿足condition的數(shù)據(jù)
print('更新前: ', student)
student['age'] = 23 #修改年齡
result = collection.update(condition, {'$set': student}) #將修改后的student替換condition, $set為重點(diǎn)
print('更新后', collection.find_one(condition))
#更新的返回值
print(result) #ok=1代表執(zhí)行成功, nModified代表影響的條數(shù)
運(yùn)行結(jié)果:
更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
比較使用和不適用$set更新數(shù)據(jù), 發(fā)現(xiàn)此時(shí)并沒(méi)有什么區(qū)別.
下面介紹區(qū)別所在:
4.3 區(qū)別
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#使用和不使用$set更新的區(qū)別
print('使用: ')
condition = {'name': 'Jack'}
student = collection.find_one(condition) #獲得滿足condition的數(shù)據(jù)
print('更新前: ', student)
student = {
'id': '201803',
'name': 'Jack',
'age': 20,
'gender': 'female',
'mother': "Jack's mother"
}
result = collection.update(condition, {'$set': student}) #將修改后的student替換condition
print('更新后', collection.find_one(condition))
#更新的返回值
print(result) #ok=1代表執(zhí)行成功, nModified代表影響的條數(shù)
#分割線
print()
print('='*20, '分割線', '='*20)
print()
print('不使用: ')
condition = {'name': 'Jack'}
student = collection.find_one(condition) #獲得滿足condition的數(shù)據(jù)
print('更新前: ', student)
student = {
'id': '201803',
'name': 'Jack',
'age': 20,
'gender': 'female',
'father': "Jack's father"
}
result = collection.update(condition, student) #將修改后的student替換condition
print('更新后', collection.find_one(condition))
#更新的返回值
print(result) #ok=1代表執(zhí)行成功, nModified代表影響的條數(shù)
運(yùn)行結(jié)果:
使用:
更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
==================== 分割線 ====================
不使用:
更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
分析上面運(yùn)行結(jié)果, 可以發(fā)現(xiàn)使用$set時(shí), 若更新數(shù)據(jù)有原數(shù)據(jù)沒(méi)有的字段, 則將該字段加到原數(shù)據(jù)上(上例為新增了mother字段), 而不會(huì)刪除任何字段. 相反, 若不使用set時(shí), 將從原數(shù)據(jù)中刪除更新數(shù)據(jù)沒(méi)有的字段, 再加上新增字段(上例為刪除了mother字段, 新增了father字段. 也可以理解為將原數(shù)據(jù)完全替換為更新數(shù)據(jù))
4.4 update_one和update_many的區(qū)別:
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#官方推薦使用
#update_one和update_many的區(qū)別
print('update_one: ')
condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)
#分割線
print()
print('='*20, '分割線', '='*20)
print()
print('update_many: ')
condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)
運(yùn)行結(jié)果:
update_one:
<pymongo.results.UpdateResult object at 0x7f6cace0f9c8>
1 1
==================== 分割線 ====================
update_many:
<pymongo.results.UpdateResult object at 0x7f6cace0fa88>
3 3
12345678910
{‘a(chǎn)ge': {'$gt': 20}}為查找年齡大于20的, {‘inc': {‘a(chǎn)ge': 1}}為將年齡+1
5. 刪除:
import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#刪除
result = collection.remove({'name': 'Jack'})
print(result)
#推薦使用
result = collection.delete_one({'age': {'$gt': 20}})
print(result.deleted_count)
result = collection.delete_many({'age': {'$gt': 20}})
print(result.deleted_count)
運(yùn)行結(jié)果:
{'ok': 1, 'n': 1}
1
2
6. 其他
除了上述常用的之外, 還包括find_one_and_delete()查找后刪除、find_one_and_replace()查找后替換, 有興趣可以百度深入了解.
總結(jié)
以上所述是小編給大家介紹的Python與Mongodb數(shù)據(jù)庫(kù)之間的操作方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- 利用Python操作MongoDB數(shù)據(jù)庫(kù)的詳細(xì)指南
- python?操作?mongodb?數(shù)據(jù)庫(kù)詳情
- MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫(kù)
- Python操作MongoDb數(shù)據(jù)庫(kù)流程詳解
- python連接、操作mongodb數(shù)據(jù)庫(kù)的方法實(shí)例詳解
- Python操作Mongodb數(shù)據(jù)庫(kù)的方法小結(jié)
- Python使用pymongo庫(kù)操作MongoDB數(shù)據(jù)庫(kù)的方法實(shí)例
- 利用Python操作MongoDB數(shù)據(jù)庫(kù)的詳細(xì)指南
相關(guān)文章
利用Python編寫一個(gè)注冊(cè)機(jī)用于生成卡密
這篇文章主要為大家詳細(xì)介紹了如何利用Python編寫一個(gè)注冊(cè)機(jī)用于生成卡密(兌換碼),并使用這些卡密登錄應(yīng)用程序,感興趣的小伙伴可以了解下2023-11-11
Python數(shù)據(jù)分析入門之教你怎么搭建環(huán)境
本篇文章要有一定的Python基礎(chǔ),知道列表,字符串,函數(shù)等的用法. 文中有非常詳細(xì)的代碼示例,對(duì)正在入門python數(shù)據(jù)分析的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
python3.7將代碼打包成exe程序并添加圖標(biāo)的方法
這篇文章主要介紹了python3.7將代碼打包成exe程序并添加圖標(biāo)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-10-10
python使用matplotlib庫(kù)生成隨機(jī)漫步圖
這篇文章主要為大家詳細(xì)介紹了使用Python的matplotlib庫(kù)生成隨機(jī)漫步圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
python爬蟲(chóng)入門教程--快速理解HTTP協(xié)議(一)
http協(xié)議是互聯(lián)網(wǎng)里面最重要,最基礎(chǔ)的協(xié)議之一,我們的爬蟲(chóng)需要經(jīng)常和http協(xié)議打交道。下面這篇文章主要給大家介紹了關(guān)于python爬蟲(chóng)入門之快速理解HTTP協(xié)議的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05
自適應(yīng)線性神經(jīng)網(wǎng)絡(luò)Adaline的python實(shí)現(xiàn)詳解
這篇文章主要介紹了自適應(yīng)線性神經(jīng)網(wǎng)絡(luò)Adaline的python實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

