python3之MongoDB

一、MongoDB簡介

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。javascript

在高負載的狀況下,添加更多的節點,能夠保證服務器性能。html

MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。java

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。python

主要特色:linux

  • MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。
  • 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。
  • 若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操做。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並能夠經過db.runCommand或mapreduce命令來執行MapReduce操做。
  • GridFS是MongoDB中的一個內置功能,能夠用於存放大量小文件。
  • MongoDB容許在服務端執行腳本,能夠用Javascript編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
  • MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

MongoDB工具:c++

使用於MongoDB管理的工具包括監控工具和GUIweb

監控:mongodb

MongoDB提供了網絡和系統監控工具Munin,它做爲一個插件應用於MongoDB中。數據庫

Gangila是MongoDB高性能的系統監視的工具,它做爲一個插件應用於MongoDB中。django

基於圖形界面的開源工具 Cacti, 用於查看CPU負載, 網絡帶寬利用率,它也提供了一個應用於監控 MongoDB 的插件。

GUI:

  • Fang of Mongo – 網頁式,由Django和jQuery所構成。
  • Futon4Mongo – 一個CouchDB Futon web的mongodb山寨版。
  • Mongo3 – Ruby寫成。
  • MongoHub – 適用於OSX的應用程序。
  • Opricot – 一個基於瀏覽器的MongoDB控制檯, 由PHP撰寫而成。
  • Database Master — Windows的mongodb管理工具
  • RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級, 支持多國語言.

二、MongoDB安裝

(1)windows平臺安裝MongoDB

下載地址:https://www.mongodb.com/download-center#community

直接下載安裝文件,而後選擇安裝路徑安裝便可,安裝完成後經過系統服務啓動mongdb

(2)linux平臺安裝MongoDB

# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.0.0.tgz # tar xf mongodb-linux-x86_64-rhel62-4.0.0.tgz # mv mongodb-linux-x86_64-rhel62-4.0.0 /usr/local/mongod #echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile # . /etc/profile #建立數據目錄 # mkdir -p /data/db #啓動服務 # mongod

更多安裝詳細:https://docs.mongodb.com/manual/installation/

三、mongoDB基本操做

(1)建立操做

建立或插入操做將新的文檔添加到集合中,若是集合不存在則插入操做將建立該集合

db.collection.insertOne()  插入單個文檔

db.collection.insertMany()   插入多個文檔

db.collection.insert()  將單個或多個文檔插入到集合中

 

> db.dba.insertOne({item:"card",qty:15}) { "acknowledged" : true, "insertedId" : ObjectId("5b35cabe638a2654f3efaa8f") } >
#指定_id插入文檔
> db.dba.insertOne({_id:1,item:"python",qty:100}) { "acknowledged" : true, "insertedId" : 1 } #插入多個文檔
> db.dba.insertMany([{_id:2,item:"java",qty:88},{_id:3,item:'javascript',qty:77},{_id:4,item:'django',qty:66}]) { "acknowledged" : true, "insertedIds" : [ 2, 3, 4 ] }

(2)查詢操做

讀取操做從集合中檢索文檔

db.collection.find()

> db.dba.find()  #查詢集合全部

> db.dba.find({_id:1})  #查詢_id爲1的文檔

> db.dba.find({_id:{$gt:2} })  #查詢_id大於2的文檔

(3)更新操做

db.collection.updateOne()   更新單個文檔

db.collection.updateMany()  更新多個文檔

db.collection.replaceOne()  替換文檔

db.dba.updateOne({item:"python"},{$set:{qty:111}})  #修改item爲python的qty爲111

#將data字段更新爲當前日期,若是不存在則建立該字段
db.dba.updateOne({item:"python"},{$currentDate:{data:true}}) #將_id大於2的文檔修改qty的值並設置date字段爲當前時間
db.dba.updateMany({_id:{$gt:2}},{$set:{qty:"hello"},$currentDate:{date:true}}) #將_id爲1的字段替換掉
db.dba.replaceOne({_id:1},{_id:1,item:"abc",qty:333,data:2018})

(4)刪除操做

db.collection.deleteOne()   #刪除一條文檔

db.collection.deleteMany()   #刪除多條文檔

#刪除指定條件的一條文檔
db.dba.deleteOne({_id:1}) #刪除集合全部文檔
db.dba.deleteMany({}) #刪除_id大於3的文檔
db.dba.deleteMany({_id:{$gt:3}})

四、python使用MongoDB

(1)安裝MongoDB驅動程序

pip install pymongo

(2)連接MongoDB

client=pymongo.MongoClient(host='localhost',port=27017) #或者
client=pymongo.MongoClient('mongodb://localhost:27017/')

(3)指定數據庫

db=client.dba #或者
db=client['dba']

(4)指定集合

collection=db.dba #或者
collection=db['dba']

(5)插入數據

#插入數據單條數據
student={ '_id':1, 'name':'python', 'age':200, } #result=collection.insert(student) #print(result) #返回一個InsertOneResult實例 #插入多條數據
suudentany=[ {'_id':2,'name':'java','age':300}, {'_id':3,'name':'javascript','age':400}, {'_id':4,'name':'c++','age':500} ] #result=collection.insert_many(suudentany) #print(result) #print(result.inserted_ids) #顯示插入數據id列表

(6)查詢數據

result=collection.find_one({'name':'python'}) #查詢單條數據
print(type(result))  #返回字典類型
print(result) #查詢多條數據,須要迭代讀取
resultall=collection.find() for i in resultall: print(i)

過濾查詢匹配的文檔

resultfiter=collection.find({'age':{'$gt':300}})  #查詢age大於300的文檔
for i in resultfiter: print(i) # {'_id': 3, 'name': 'javascript', 'age': 400} {'_id': 4, 'name': 'c++', 'age': 500}

比較符號還有:$lt小於、$gt大於、$lte小於等於、$gte大於等於、$ne不等於、$in在範圍內、$nin不在範圍內

另外還能夠用正則匹配$regex

result=collection.find({'name':{'$regex':'^p.*'}}) #匹配以P開頭的name

其餘功能符號:$exists屬性是否存在、$type類型判斷、$mod數字餘數、$text文本查詢、$shere條件查詢

更多詳細用法能夠在MongoDB官網找到:https://docs.mongodb.com/manual/reference/operator/query/

(7)計數

要統計查詢結果有多少條數據,能夠調用count()方法

count=collection.find().count() #或者統計符合條件的數據
count=collection.find({'age':20}).count()

(8)排序

排序時,直接調用sort()方法,並在其中傳入排序的字段及升降序標誌便可

pymongo.ASCENDING爲升序,pymongo.DESCENDING爲降序

results=collection.find().sort('name',pymongo.ASCENDING)

(9)偏移

如只想去某幾個元素,能夠利用skip()方法偏移位置來忽略前面的元素

results=collection.find().sort('name',pymongo.ASCENDING).skip(2) #只取第三個及後面的元素

另外還可使用limit()方法指定要取的結果個數

results=collection.find().sort('name',pymongo.ASCENDING).skip(2).limit(2)  #只取兩個結果

(10)更新

可使用update()方法來更新數據,但此方法不夠安全可使用$set它只 更新存在文檔內存在的字段

result=collection.update({'name':'python'},{'date':8}) #上面方法不安全,它會將除了_id和要更新的數據外的其餘字段會被刪除 #使用$set會比較安全
result=collection.update({'name':'python'},{'$set':{'date':12}})

官方推薦使用update_one()和update_many()方法,來嚴格控制影響的字段,它須要使用$類型的操做字符來做爲字典的鍵名

result=collection.update_one({'_id':3},{'$set':{'name':'javascript'}}) print(result) print(result.matched_count,result.modified_count) #打印匹配的數據條數和影響的數據條數

#updata_many()會將全部符合條件的數據都更新
result=collection.update_many({'date':{'$gt':2}},{'$inc':{'data':10}})  #將全部date值大於2的文檔加上10

(11)刪除

刪除可使用的方法有remove()符合條件的數據都會被刪除,delete_one()值刪除符合條件的第一條和delete_many()刪除全部符合條件的

result=collection.delete_one({'name':'java'}) result1=collection.delete_many({'data':{'$gt':20}})

(12)其餘操做

pyMongo還提供了一些組合方法:

find_one_and_delete()   查找後刪除

find_one_and_replace()  查找後替換

find_one_and_update()  查找後更新

create_index()   在集合上建立索引

create_indexes()  在集合上建立一個或多個索引

drop_index()  刪除此集合上的索引

更多集合操做方法:http://api.mongodb.com/python/current/api/pymongo/collection.html

 pymongo的API文檔:http://api.mongodb.com/python/current/api/pymongo/index.html

相關文章
相關標籤/搜索