Python常見MongoDB資料庫操作例項總結
本文例項講述了Python常見MongoDB資料庫操作。分享給大家供大家參考,具體如下:
MongoDB 是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能。接下來記錄一下在使用PyMongo操作MongoDB
下載pymongo庫
pip install pymongo
前置操作
# 獲取MongoDB操作,localhost為host,27017為MongoDB預設port client = pymongo.MongoClient("mongodb://localhost:27017/") # 操作test資料庫 db = client.test # 獲取Student集合 student = db.Student
插入單條資料
# 插入一條資料,並獲取返回結果 res = student.insert_one({"name":"老王"}) # 獲取插入之後該條資料的id object_id = res.inserted_id print(object_id)
插入多條資料
# 插入9條資料 res = student.insert_many([{"name":"name%d"%index} for index in range(1,10)]) # 獲取插入之後該9條資料的ids,object_ids為一個list object_ids = res.inserted_ids print(object_ids)
查詢單條資料
# 查詢單條資料,res為一個dict res = student.find_one({"name":"老王"})
查詢滿足條件的所有資料
# 查詢滿足條件的所有資料,res為一個pymongo.cursor.Cursor物件 res = student.find({"name":"老王"}) # 獲取資料個數 print(res.count()) for index in res: # index為一個dict。注意:這個迴圈只能進行一次,如需再次操作返回結果,需要在find一次,或將list(res),將這個返回結果儲存起來 print(index)
更新
# 查詢並更新。{"name":"老王"}為查詢條件;{"$set":{"addr":"家住隔壁"}}更新資料;upsert=False找不到不插入資料,upsert=True找不到則插入資料 # res為返回結果,res為一個字典物件,是之前資料的字典 res = student.find_one_and_update({"name":"老王"},{"$set":{"addr":"家住隔壁"}},upsert=False)
刪除單條資料
student.delete_one({"name":"老王"})
刪除匹配條件的所有資料
student.delete_many({"name":"老王"})
附:更多MongoDB的操作
MongoDB 是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能。接下來記錄一下在終端怎麼使用MongoDB:
常用命令
切換/建立資料庫
use xxx; # 切換資料庫,不存在則建立
插入資料
# 插入資料,name="Python",age=100,Student為集合(表)名,Student不存在會自動建立 db.Student.insert({name:"Python",age:100})
或者定義一個字典
document = {name:"Python",age:100} db.Student.insert(document)
查詢資料
# 查詢所有資料 db.Student.find() # 查詢所有資料並格式化輸出 db.Student.find().pretty() # 條件查詢,name="python"的所有資料 db.Student.find({name:"python"}) # 條件查詢,age > 50的所有資料 db.Student.find({age:{$gt:50}}) # 條件查詢,age >= 50的所有資料 db.Student.find({age:{$gte:50}}) # 條件查詢,age < 50的所有資料 db.Student.find({age:{$lt:50}}) # 條件查詢,age <= 50的所有資料 db.Student.find({age:{$lte:50}}) # 條件查詢,age == 50的所有資料 db.Student.find({age:{$eq:50}}) # 條件查詢,age != 50的所有資料 db.Student.find({age:{$ne:50}}) # 條件查詢,存在name欄位的所有資料 db.Student.find({name:{$exists:true}}) # 多條件查詢,name="python"並且age=50的所有資料 db.Student.find({name:"python",age:50}) # $and語法,name="python"並且age=50的所有資料。 db.Student.find({$and:[{name:"python"},{age:50}]}) # 查詢字典陣列的資料infoList = [{"province":"廣東","city":"深圳"}] db.Student.find({"infoList.province":"廣東"}) # 查詢數量 db.Student.find({name:"python"}).count() # 或查詢,$or語法。查詢name="python"或name="android"的所有資料 db.Student.find({$or:[{name:"python"},{name:"android"}]}) # $size語法,查詢info陣列長度為8的所有資料 db.Student.find({info:{$size:8}}) # $not語法,查詢info陣列長度不為8的所有資料 db.Student.find({info:{$not:{$size:8}}}) # and與or聯合使用.相當於 where age=18 and (name="python" or name="android") db.Student.find({age:18,$or:[{name:"python"},{name:"android"}]}) # $nor語法,搜尋name既不等於"python"且不等於"android"的所有資料 db.Student.find({"$nor":[{name:"python"},{name:"android"}]}) # $in語法.搜尋name="老張"或name="老王"的所有資料 db.Student.find({name:{$in:["老王","老張"]}}) # $nin語法.搜尋name不為"老張"或"老王"的所有資料 db.Student.find({name:{$nin:["老王","老張"]}}) # $all語法,搜尋info=["aaa","bbb"]的所有資料 db.Student.find({info:{$all:["aaa","bbb"]}}) # $mod語法,搜尋sex % 2 == 0的所有資料 db.Student.find({sex:{$mod:[2,0]}}) # $where語法,搜尋age=info的所有資料 db.Student.find({"$where":"this.age==this.info"}) # $slice語法,過濾,info陣列中的後3個數據 db.Student.find({},{info:{$slice:-3}}) # $slice語法,過濾,info陣列中的前3個數據 db.Student.find({},{info:{$slice:3}}) # $slice語法,過濾,info陣列中跳過20個數據之後取10個數據 db.Student.find({},{info:{$slice:[20,10]}}) # $slice語法,過濾,info陣列中倒數第20個數據之後取10個數據 db.Student.find({},{info:{$slice:[-20,10]}}) # 正則.獲取name包含"王"的所有資料 db.Student.find({name:{$regex:"王"}}) # 正則。獲取name包含"a"並且不區分大小寫的所有資料 db.Student.find({name:{$regex:"a",$options:"i"}})
更新資料
# 找到name="MongoDB"的資料,將其更改為name="MongoDB學習",只修改匹配到的第一條資料 db.Student.update({name:"MongoDB"},{$set:{name:"MongoDB學習"}}) # 找不到name="MongoDB"的資料,則插入name="MongoDB學習",找到了則為修改。upsert:true找不到則插入,預設false,不插入 db.Student.update({name:"MongoDB"},{$set:{name:"MongoDB學習"}},{upsert:true}) # 找到name="MongoDB"的資料,將其更改為name="MongoDB學習"。multi:true更改所有匹配的資料,預設false,只匹配第一條 db.Student.update({name:"MongoDB"},{multi:true}) # 匹配name="MongoDB"的第一條資料,將其更改為name="MongoDB學習" db.Student.updateOne({name:"MongoDB"},{$set:{name:"MongoDB學習"}}) # 更新字典陣列的資料infoList = [{"province":"廣東","city":"深圳"}] db.Student.update({"infoList.province":"廣東"},{"$set":{"province.$.city":"廣州"}}) # 將age>18的資料,修改name="xxx",第一個false:不存在不會插入(true為不存在則插入),第二個false:只匹配第一條資料(true為匹配所有資料) db.Student.update({age:{$gt:18}},{$set:{name:"xxx"}},false,false) # 在name="python"的所有資料裡,將age欄位值+1 db.Student.update({name:"python"},{$inc:{age:1}}) # 在name="python"的所有資料裡,將age鍵刪除,1可以是任何值 db.Student.update({name:"python"},{$unset:{age:1}}) # 在name="python"的所有資料裡,將age鍵名修改成"Age" db.Student.update({name:"python"},{$rename:{age:"Age"}}) # 在name="python"的所有資料裡,在名為array的陣列新增abc元素 db.Student.update({name:"python"},{$push:{array:"abc"}}) # 在name="python"的所有資料裡,將["abc","adc"]裡所有元素新增到array裡面 db.Student.update({name:"python"},{$pushAll:{array:["abc","adc"]}}) # 在name="python"的所有資料裡,在名為array的陣列刪除abc元素 db.Student.update({name:"python"},{$pull:{array:"abc"}}) # 在name="python"的所有資料裡,將["abc","adc"]裡所有元素全部從array裡刪除 db.Student.update({name:"python"},{$pullAll:{array:["abc","adc"]}}) # 在name="python"的所有資料裡,刪除array陣列尾部資料,無論array為多少都只刪除一條,array小於0時,刪除頭部第一條,array大於等於0時,刪除尾部第一條 db.Student.update({name:"python"},{$pop:{array:2}})
刪除資料
# 刪除匹配到的所有資料 db.Student.remove({name:"老張"}) # 刪除匹配到第一條資料,justOne:true只刪除一條資料 db.Student.remove({name:"老張"},{justOne:true})
**type**:type**:type操作符是基於BSON型別來檢索集合中匹配的資料型別,並返回結果
常用type型別:
數字 | 型別 |
---|---|
1 | Double |
2 | String |
3 | Object |
4 | Array |
5 | Binary data |
6 | Undefined |
7 | Object id |
8 | Boolean |
9 | Date |
10 | Null |
11 | Regular Expression |
13 | JavaScript |
14 | Symbol |
15 | JavaScript (with scope) |
16 | 32-bit integer |
17 | Timestamp |
18 | 64-bit integer |
255 | Min key |
127 | Max key |
# 查詢name為String型別的所有資料,2為String db.Student.find({name:{$type:2}})
- limit:限制條數
# 查詢name="python"的所有資料,限制2條 db.Student.find({name:"python"}).limit(2)
- skip:跳過資料
# 查詢name > 15的資料,跳過前兩條,並限制只查詢兩條 db.Student.find({name:{$gt:15}}).limit(2).skip(2)
- sort:排序,1位升序,-1位降序
# 查詢所有資料,並以age升序排列 db.Student.find().sort({age:1}) # 多條件排序 db.Student.find().sort({age:1,score:-1})
- findAndModify:查詢並更新
# 查詢name="python"的所有資料,並修改age=18 db.Student.findAndModify({query:{name:"python"},update:{$set:{age:18}}})
- ObjectId
# 獲取文件的建立時間 ObjectId("598542475e6b2464187abef7").getTimestamp()
- aggregate:聚合查詢
常用聚合表示式:
表示式 | 描述 |
---|---|
$sum | 和 |
$avg | 平均值 |
$min | 最小值 |
$max | 最大值 |
$push | 在結果中插入值到陣列中 |
$addToSet | 在結果中插入值到陣列中,但不建立副本 |
$first | 根據資源文件的排序,獲取第一個資料 |
$last | 根據資源文件的排序,獲取最後一個數據 |
# 根據name分組,並插入sum,sum值為該組所有age的和 db.Student.aggregate([{$group:{_id:"$name",sum:{$sum:"$age"}}}]) # 根據name分組,並插入sum,sum值為該組的數量,並以sum排序,升序 db.Student.aggregate([{$group:{_id:"$name",sum:{$sum:1}}}]) # 根據name分組,並插入avg,avg值為該組所有age的平均值 db.Student.aggregate([{$group:{_id:"$name",avg:{$avg:"$age"}}}]) # 根據name分組,並插入min,min值為該組所有age的最小值 db.Student.aggregate([{$group:{_id:"$name",min:{$min:"$age"}}}]) # 根據name分組,並插入max,max值為該組所有age的最大值 db.Student.aggregate([{$group:{_id:"$name",max:{$max:"$age"}}}]) # 根據name分組,並插入陣列array,array值為該組所有的age值 db.Student.aggregate([{$group:{_id:"$name",array:{$push:"$age"}}}]) # 根據name分組,array:{$addToSet:"$age"}}}]) # 根據name分組,並插入f,f值為該組age下的第一個值 db.Student.aggregate([{$group:{_id:"$name",f:{$first:"$age"}}}]) # 根據name分組,並插入l,l值為該組age下的第一個值 db.Student.aggregate([{$group:{_id:"$name",l:{$last:"$age"}}}])
管道操作例項
1. $project:用於修改文件的輸出結構
# 查詢所有的name,age資料,預設包含_id資料。讓不包含_id,可以使_id:0 db.Student.aggregate({$project:{name:1,age:1}})
此時輸出的內容只有_id,name,age,_id是預設會輸出的,想不輸出_id,可以使_id:0
2. $match:用於過濾資料
db.Student.aggregate([{$match:{age:{$gt:19,$lte:23}}},{$group:{_id:null,count:{$sum:1}}}])
match過濾出age大於19且小於等於23的資料,然後將符合條件的記錄送到下一階段match過濾出age大於19且小於等於23的資料,然後將符合條件的記錄送到下一階段group管道操作符進行處理
3. $skip:將前5個過濾掉
db.Student.aggregate({$skip:5})
$skip將前面5個數據過濾掉
更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python常見資料庫操作技巧彙總》、《Python數學運算技巧總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》
希望本文所述對大家Python程式設計有所幫助。