1. 程式人生 > 資料庫 >Python常見MongoDB資料庫操作例項總結

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程式設計有所幫助。