MongoDB是一個基於分佈式 文件存儲的NoSQL數據庫,適合存儲JSON風格文件的形式。python
{'name':'guojing','gender':'男'}
{'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108'}
sudo apt-get install mongodb
配置文件爲 /etc/mongodb.conf,默認端口號:27017正則表達式
sudo service mongodb start #至關於執行命令 sudo mongod --config /etc/mongod.conf
sudo service mongodb stop
sudo service mongodb restart #修改了配置文件/etc/mongodb.conf後,須要重啓mongodb服務器讓配置生效
sudo mongo
db
show dbs
use 數據庫名
切換數據庫,若是數據庫不存在,當插入數據或建立集合時,會自動建立這個數據庫sql
db.dropDatabase()
刪除當前指向的數據庫,若是不存在,則什麼也不作mongodb
db.createCollection(name[,options]) #name集合名稱 #options可選,是一個用於指定集合配置的文檔,其中capped參數默認不設置上限(false),若設置上限(true)則須要指定參數size,單位字節
#不設置集合大小 db.createCollection("stu") #設置集合大小 db.createCollection("sub", { capped : true, size : 10 } )
show collections
db.集合名.drop()
db.集合名.insert(文檔) 或 db.集合名.insert([文檔...])
#若是不指定_id字段,則分配一個惟一的ObjectId;若是指定_id字段,且_id已經存在時,不作任何操做;若是一次性插入多條數據,以數組的方式傳入文檔
# 不指定_id db.stu.insert({name:'gj',gender:1}) #指定_id s1={_id:'20160101',name:'hr'} s1.gender=0 db.stu.insert(s1)
db.集合名.remove(條件,{justone:<boolean>}) #參數justOne默認false,刪除多條
# 只刪除匹配到的一條數據 db.stu.remove({gender:0},{justOne:true}) #刪除全部 db.stu.remove({})
db.集合名.update({條件},$操做符,{multi: <boolean>}]) #參數multi只和$操做符一塊兒使用,默認false,只修改一條數據,true表示修改多條數據
# 不使用操做符$set,修改整條文檔 db.stu.update({name:'hr'},{name:'mnc'}) #使用操做符$set指定屬性修改 db.stu.update({name:'hr'},{$set:{name:'hys'}}) #multi參數和$set一塊兒使用,修改多條文檔 db.stu.update({},{$set:{gender:0}},{multi:true})
db.集合名.save(document)
#在手動插入_id字段時,若是_id已經存在,作全文檔更新操做,其他均表示插入數據。
db.stu.save({_id:'20160102','name':'yk',gender:1}) db.stu.save({_id:'20160102','name':'wyk'}) #對上述文檔作修改
db.集合名.find({條件文檔}) #查詢全部 db.集合名.findOne({條件文檔}) #只查詢第一條 db.集合名.find({條件文檔}).pretty() #結果格式化輸出
#查詢年齡大於等於18的學生 db.stu.find({"age":{$gte:18}})
# 查詢年齡大於或等於18,而且性別爲1的學生 db.stu.find({"age":{$gte:18},"gender":1}) #查詢年齡大於18,或性別爲0的學生 db.stu.find({$or:[{"age":{$gt:18}},{"gender":1}]}) #查詢年齡小於18或者大於20,性別爲1的學生 db.stu.find({$or:[{"age":{$lt:18}},{"age":{$gt:20}}],"gender":1})
#查詢年齡1八、20以及22歲的學生 db.stu.find({"age":{$in:[18,20,22]}}) #查詢年齡不等於18或20的學生 db.stu.find({"age":{$nin:[18,20]}})
#查詢姓黃的學生 db.stu.find({"name":/^黃/}) db.stu.find({"name":{$regex:"^黃"}})
#查詢年齡18-22的學生 db.stu.find({$where:function(){return this.age>18 && this.age<22}}) #查詢年齡小於18或者大於22的學生 db.stu.find({$where:function(){return this.age<18 || this.age>22}})
db.集合名.find({條件},{字段名:1,...}) #1表示該字段顯示,0不顯示;_id列默認顯示,不顯示須要明確設置爲0
#查詢姓名和年齡(顯示_id) db.stu.find({},{name:1,gender:1}) #查詢姓名和年齡(不顯示_id) db.stu.find({},{_id:0,name:1,gender:1})
db.集合名.find({條件}).skip(number) #number默認爲0
#查詢從第3條開始的學生信息 db.stu.find().skip(2)
db.集合名.find({條件}).limit(number) #不寫number參數,默認讀取全部文檔
#讀取3條學生信息 db.stu.find().limit(3)
#查詢第5-9條學生信息 db.stu.find().skip(4).limit(5) #至關於跳過4條數據,選5條
db.集合名稱.find({條件}).sort({字段:1,...}) #1表示升序,-1表示降序
#根據性別降序,再根據年齡升序 db.stu.find().sort({"gender":-1,"age":1})
db.集合名.find({條件}).count()
或者
db.集合名.count({條件})
#統計年齡大於20的男生人數 db.stu.count({"age":{$gt:20},"gender":1})
db.集合名.distinct("字段名",{條件})
db.集合名.aggregate([{管道:{表達式}}...])
# 統計男、女生人數 db.stu.aggregate([{$group:{"_id":'gender',"couter":{$sum:1}}}]) #結果文檔中顯示_id和counter的值
# 求學生總人數和平均年齡 db.stu.aggregate([{$group:{_id:null,counter:{$sum:1},average_age:{$avg:"$age"}}}])
#統計男、女生信息 db.stu.aggregate([{$group:{_id:"$gender",objects:{$push:"$$ROOT"}}}])
#查詢年齡大於20的學生 db.stu.aggregate([{$match:{age:{$gt:20}}}]) #查詢年齡大於20的男、女生人數 db.stu.aggregate([{$match:{age:{$gt:20}}},{$group:{_id:"$gender",counter:{$sum:1}}}])
#查找學生姓名、年齡 db.stu.aggregate([{$project:{"_id":0,"name":1,"age":1}}]) #查詢男生、女生人數,但僅輸出人數 db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$project:{_id:0,counter:1}}])
#查詢學生信息,按年齡升序 db.stu.aggregate([{$sort:{age:1}}]) #查詢男生、女生人數,按人數降序 db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}},{$sort:{counter:-1}}])
#查詢2條學生信息 db.stu.aggregate([{$limit:2}])
#查詢從第3條開始的學生信息 db.stu.aggregate([{$skip:2}]) #統計男生、女生人數,按人數升序,取第二條數據 db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{"counter":1}},{$skip:1},{$limit:1}])
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
for(var i=0;i<1000000;i++){db.stu.insert({name:'test'+i,num:i})}
查詢語句.explain("executionStats")
'millis'後面顯示的是查詢時間,單位ms數據庫
db.集合.ensureIndex({屬性:1或-1}) #1表示升序,-1表示降序,創建後的索引名稱爲"屬性_1"或者"屬性_-1"
例如:db.stu.ensureIndex({name:1}),創建後的索引名稱爲"name_1"json
db.集合.ensureIndex({屬性:1},{"unique":true})
db.集合名.ensureIndex({屬性1:1,屬性2:1...})
db.集合名.getIndexes()
db.集合名.dropIndex("索引名稱")
爲了更安全的訪問mongodb,須要訪問者提供用戶名和密碼,因而須要在mongodb中建立用戶。mongodb數據庫採用了角色-用戶-數據庫的安全管理方式。數組
use admin #首先切換到admin數據庫 db.createUser({ user:'用戶名', pwd:'密碼', roles:[{role:'root',db:'admin'}] })
#noauth = true auth = true #開啓安全驗證
sudo service mongodb restart
# sudo mongo -u '用戶名' -p '密碼' --authenticationDatabase '數據庫名' sudo mongo -u 'admin' -p '密碼' --authenticationDatabase 'admin'
db.createUser({ user:'用戶名', pwd:'密碼', roles:[{role:'readWrite',db:'數據庫名'}...] #數組裏能夠有多個角色文檔,好比用戶在不一樣的數據庫裏都有讀寫權限 })
show users
db.updateUser('用戶名',{pwd:'新密碼',roles:[{'新角色'}...]})
use admin #切換到admin數據庫 db.system.users.remove(條件)
sudo mongo -u '用戶名' -p '密碼' --authenticationDatabase '數據庫名'
複製提供了數據的冗餘備份,並在多個服務器上存儲數據的副本,容許從硬件故障和服務中斷中恢復數據,可以實現無宕機維護(自動故障轉移與自動恢復)。安全
複製至少須要2個節點,其中1個爲主節點,其它均爲從節點。任何節點都可以成爲主節點。服務器
主節點負責全部寫入操做,從節點按期輪詢主節點獲取這些操做並執行這些操做,從而保證從節點的數據與主節點一致。app
mkdir ~/Desktop/t1
mkdir ~/Desktop/t2
sudo mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
sudo mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
sudo mongo --host 192.168.196.128 --port 27017
rs.initiate()
哪一個服務器執行初始化,哪一個服務器就做爲主節點,rs是mongo服務器中專門用於複本集操做的內置對象
rs.status()
rs.add("192.168.127.128:8899")
sudo mongo --host 192.168.196.128 --port 27018
rs.slaveOk()
主服務器插入數據,從服務器就能夠讀取數據了
rs.remove('192.168.196.128:27018') #須要在主服務器操做
關閉主服務器後再從新啓動,會發現原來的從服務器變爲了主服務器,新啓動的服務器(原來的主服務器)變爲了從服務器,可是注意從新設置rs.slaveOk()
sudo mongodump -h 服務器地址 -d 須要備份的數據庫 -o 備份數據存放目錄
mkdir ~/Desktop/test1_bak #建立存放備份數據的目錄 sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1_bak
sudo mongorestore -h 服務器地址 -d 恢復後數據庫名 --dir 備份數據所在位置
sudo mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1_bak/test1
sudo pip3 install pymongo
import pymongo
有安全認證:client=MongoClient("mongodb://用戶名:密碼@host:27017/數據庫名稱") 無安全認證:client=MongoClient("mongodb://localhost: 27017")
db = client.數據庫名
例如:db = client.test
stu = db.stu
stu1 = stu.find_one({條件}) #返回一條文檔,字典類型
cursor = stu.find({條件}) #返回迭代器對象cursor #方式1:用for循環迭代取值 for s in cursor: print(s) #字典類型 #方式2:用next取值 s1 = next(cursor) s2 = next(cursor) ...
stu.insert_one(文檔)
stu.insert_many([文檔1,文檔2...])
stu.update({條件},文檔) #注意條件中的數字必定要寫成字符串類型
stu.update_one({條件},{$set:{文檔}})
stu.update_many({條件},{$set:{文檔}})
stu.delete_one({條件})
stu.delete_many({條件})