使用Python操作Mongodb


MongoDB大數據處理權威指南(第3版) 第7章 Python和Mongodb 讀書筆記
 
樣例字典:
item = {
  "Type" : "Laptop",
  "ItemNumber" : "1234EXD",
  "Status" : "In use",
  "Location" : {
    "Department" : "Development",
    "Building" : "2B",
    "Floor" : 12,
    "Desk" : 120103,
    "Owner" : "Walker, Jan"
  },
  "Tags" : ["Laptop","Development","In use"]
}
 
一、連接
from pymongo import MongoClient
 
#IP:127.0.0.1,端口:27017
Connection = MongoClient("127.0.0.1", 27017)
 
#庫名inventory
db = Connection.inventory
 
#集合名items
collection = db.items
 
 
二、插入數據
#插入一個文檔,item是一個字典{}
collection.insert_one(item)
 
#插入多個文檔,two是一個列表[{},{}]
collection.insert_many(two)
 
 
三、搜索數據
#搜索單個文檔
collection.find_one()
 
#搜索ItemNumber=3456TFS,且不返回_id
collection.find_one({"ItemNumber" : "3456TFS"}, fields={'_id' : False})
 
#搜索多個文檔
for doc in collection.find():
    doc
 
#搜索嵌套字典的內容
for doc in collection.find({"Location.Department" : "Development"}):
    doc
 
#搜索數組中的內容
for doc in collection.find({"Tags" : "Laptop"}):
    doc
 
#指定搜索返回鍵值對
for doc in collection.find({"Status" : "In use"},Projection={'ItemNumber':True,'Location.Owner':True}):
    doc
 
#分頁:返回(按ItemNumber排序,略過第1個文檔,取之后的2個文檔)
for doc in collection.find({"Status" : "In use"},fields={'ItemNumber':True,'Location.Owner':True}).skip(1).limit(2).sort('ItemNumber'):
    doc
 
 
四、聚集查詢
#count()統計數目
collection.count()
 
#帶條件的count統計
collection.find({"Location.Department" : "Development", "Status" : "In use"}).count()
 
#distinct()統計唯一數據的數目
collection.distinct("ItemNumber")
 
 
#使用聚集框架對數組分組:將數組Tags中的每個元素做為id,並創建Totals字段,其值為該元素的和
collection.aggregate([
    {'$unwind' : '$Tags'},
    {'$group' : {'_id' : '$Tags', 'Totals' : {'$sum' : 1}}}
])
 
#使用聚集框架對數組分組:將數組Tags中的每個元素做為id,並創建Totals字段,其值為該元素的和;結果按Totals降序輸出
from bson.son import SON
collection.aggregate([
    {'$unwind' : '$Tags'},
    {'$group' : {'_id' : '$Tags', 'Totals' : {'$sum' : 1}}},
    {'$sort' : SON([('Totals', -1)])}
])
 
除$sum管道表達式,$group管道操作符還支持:
#push: 創建並返回一個數組,它包含了分組中搜索到的所有數據
$addToSet: 在分組中創建並返回一個數組,它包含了分組中搜索到的所有唯一數據
$first: 返回分組中找到的第一個數據
$last: 返回分組中找到的最后一個數據
$max: 返回分組中找到的最大值
$min: 返回分組中找到的最小值
$avg: 返回分組中找到的平均值
 
 
#使用條件操作符重定義查詢:$lt小於,$lte小於等於,$gt大於,$gte大於等於
for doc in collection.find({"Location.Desk" : {"$lt" : 120102}}):
    doc
 
#使用$ne搜索不等於的數據
collection.find({"Status" : {"$ne" : "In use"}}).count()
 
#使用$in指定匹配的數組
for doc in collection.find({"Tags" : {"$in" : ["Not used", "Development"]}}):
    doc
 
#使用$nin指定不匹配的數組
for doc in collection.find({"Tags" : {"$nin" : ["Development"]}}):
    doc
 
#使用$all搜索匹配數組所有值的文檔
for doc in collection.find({"Tags" : {"$all" : ["Development", "Storage"]}}):
    doc
 
#使用$or指定多個匹配表達式
for doc in collection.find({"$or" : [{"Location.Department" : "Storage"},{"Location.Owner" : "Anderson, Thomas"}]}):
    doc
 
#使用$or與其他條件結合使用
for doc in collection.find({“Location.Building” : "2B", "$or" : [{"Location.Department" : "Storage"},{"Location.Owner" : "Anderson, Thomas"}]}):
    doc
 
 
#使用$slice從數組中獲取元素
樣例字典
chair = ({
  "Status" : "Not used",
  "Tags" : ["Chair", "Not used", "Storage"],
  "ItemNumber" : "6789SID",
  "Location" : {
  "Department": "Storage",
  "Building" : "2B"},
  "PreviousLocation" : [120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110]
})
 
返回椅子所屬的前三張桌子
collection.find_one({'ItemNumber' : '6789SID'}, {"PreviousLocation" : {'$slice' : 3}})
 
返回椅子所屬的最后三張桌子
collection.find_one({'ItemNumber' : '6789SID'}, {"PreviousLocation" : {'$slice' : -3}})
 
忽略椅子所屬的前5個位置,返回三張桌子
collection.find_one({'ItemNumber' : '6789SID'}, {"PreviousLocation" : {'$slice' : [5,3]}})
 
 
#使用正則表達式搜索
import re
 
返回ItemNumber含有4的文檔,只顯示ItemNumber
for doc in collection.find({“ItemNumber” : re.compile('4')}, {'ItemNumber' : True}):
    doc
 
返回ItemNumber以FS結尾的文檔,只顯示ItemNumber
for doc in collection.find({“ItemNumber” : re.compile('.FS$')}, {'ItemNumber' : True}):
    doc
 
返回Owner以anderson開頭的文檔,不區分大小寫
for doc in collection.find({“Location.Owner” : re.compile('^anderson.', re.IGNORECASE)}):
    doc
 
 
五、修改數據
#整個文檔更新
updatedoc ={……} #定義更新數據
collection.update_one({“ItemNumber” : "6789SID"}, updatedoc) #更新ItemNumber=6789SID
 
#使用$inc增加整數值,使桌號+20
collection.update_one({“ItemNumber” : "6789SID"}, {"$inc" : {"Location.desk" : 20}})
 
#使用$set修改現有值,修改所有符合條件的文檔將其building值改為3B
collection.update_many({“Location.Department” : "Development"}, {"$set" : {"Location.building" : "3B"}})
 
#使用$unset移除鍵/值字段
collection.update_one({“ItemNumber” : "6789SID", "Status" : "Not used"}, {"$unset" : {"Location.building" : 1}})
 
#使用$push向數組中添加值,如果數組不存在,就使用指定的值創建該數組
collection.update_many({"Location.Owner" : "Anderson, Thomas"}, {"$push" : {"Tags" : "Anderson"}})
 
#使用$push和$each向數組中添加多個值
collection.update_one({"Location.Owner" : re.compile("^Walker,")}, {"$push" : {"Tags" : {'$each' : ['Walker','Warranty']}}})
 
#使用$addToSet向數組中添加值,與$push區別為,該方法更新前,會檢查數組是否已經存在
collection.update_many({"Type" : "Chair"}, {"$addToSet" : {"Tags" : "Warranty"}})
 
#使用$addToSet和$each向數組中添加多個值,如果值已存在於數組,不會再次添加
collection.update_one({"Type" : "Chair", "Location.Owner" : re.compile("^Walker,")}, {"$addToSet" : {"Tags" : {'$each' : ['Walker','Warranty']}}})
 
#使用$pop從數組中刪除元素,-1刪除第一個,1刪除最后一個
collection.update_one({"Type" : "Chair"}, {"$pop" : {"Tags" : -1}})
 
#使用$pull從數組中刪除特定的值
collection.update_one({"Type" : "Chair"}, {"$pull" : {"Tags" : "Double"}})
 
#使用$pull從數組中刪除特定的多個值
collection.update_one({"Type" : "Chair"}, {"$pullAll" : {"Tags" : ["Double", "one"]}})
 
#使用replace_one()替代文檔,如果未找到匹配的文檔,就插入它
olddoc={...} #定義被替換的文檔
newdoc={...} #定義要替換的文檔
collection.replace_one(olddoc,newdoc,upsert=Ture)
 
#find_one_and_update()修改單個文檔
query:指定查詢使用的過濾器
update:指定用於更新文檔的信息
upsert:如果設置為真,執行更新插入操作
sort:以特定的順序對匹配文檔進行排序
return_document:設置為ReturnDocument.AFTER,就返回更新的文檔,而不是選中的文檔
projection:指定返回的字段
 
collection.find_one_and_update(query={"Type" : "Desk"},update={'$set' : {'Status' : 'repair'}}, return_document=ReturnDocument.AFTER)
 
#find_one_and_delete()刪除單個文檔
collection.find_one_and_delete(query={"Type" : "Desk"},sort={'ItemNumber' : -1})
 
 
六、批處理數據
以有序方式批處理數據,若發生了一個錯誤,操作會停止
bulk = collection.initialize_ordered_bulk_op() #初始化有序列表
bulk.insert_one({...}) #把操作裝入有序列表bulk
bulk.insert_one({...})
bulk.find({...})
results = bulk.execute() #執行
pprint(results) #打印執行結果
 
 
七、刪除數據
#刪除單個文檔
delete_one({"Type" : "Desk"})
 
#刪除多個文檔
delete_many({"Type" : "Desk"})
 
#刪除集合
db.items.drop()
 
#刪除數據庫
Connection.drop_database("inventory")

 

---------------------------------------------------------------------------------

關注微信公眾號即可在手機上查閱,並可接收更多測試分享~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM