MongoDB 快速入門之 Python 交互篇 - 手把手教會你數(shù)據(jù)恢復(fù)與備份 | 【綻放吧!數(shù)據(jù)庫】
易擴展
大數(shù)據(jù)量,高性能
靈活的數(shù)據(jù)模型
安裝與啟動
安裝mongodb:sudo apt-get install -y mongodb-org
安裝可視化管理界面:https://robomongo.org/download
查看幫助:mongod –help
啟動服務(wù):sudo service mongod start
停止服務(wù):sudo service mongod stop
重啟服務(wù):sudo service mongod restart
查看進程:ps ajx|grep mongod
配置文件的位置:/etc/mongod.conf
默認端口:27017
日志的位置:/var/log/mongodb/mongod.log
查看當(dāng)前的數(shù)據(jù)庫:db
查看所有的數(shù)據(jù)庫:show dbs /show databases
切換數(shù)據(jù)庫:use db_name
刪除當(dāng)前的數(shù)據(jù)庫:db.dropDatabase()
當(dāng)集合不存在時,插入任何一條數(shù)據(jù)集合自動創(chuàng)建。
或者手動創(chuàng)建集合:db.createCollection(name,[options])
其中options:
參數(shù)capped: 默認值為false表示不設(shè)置上限,值為true表示設(shè)置上限 參數(shù)size: 當(dāng)capped值為true時,需要指定此參數(shù),表示上限大小,當(dāng)文檔達到上限時,會將之前的數(shù)據(jù)覆蓋,單位為字節(jié)
當(dāng)集合存在時:
查看集合:show collections
刪除集合:db.集合名稱.drop()
Object ID:文檔ID
String: 字符串,最常使用,必須是有效的UTF-8
Boolean: 存儲一個布爾值,true或false
Integer: 整數(shù)可以是32位或64位,這取決于服務(wù)器
Double: 存儲浮點值
Arrays: 數(shù)組或列表, 多個值存儲到一個鍵
Object: 用于嵌入式的文檔, 即一個值為一個文檔
Null: 存儲Null值
Timestamp: 時間戳,表示從1970-1-1到現(xiàn)在的總秒數(shù)
Date: 存儲當(dāng)前日期或時間的UNIX時間格式
注意點:
創(chuàng)建日期語句如下 :參數(shù)的格式為YYYY-MM-DD new Date('2017-12-20') 每個文檔都有一個屬性,為_id,保證每個文檔的唯一性 可以自己去設(shè)置_id插入文檔,如果沒有提供,那么MongoDB為每個?檔提供了一個獨特的_id,類型為objectID objectID是一個12字節(jié)的十六進制數(shù): 前4個字節(jié)為當(dāng)前時間戳 接下來3個字節(jié)的機器ID 接下來的2個字節(jié)中MongoDB的服務(wù)進程id 最后3個字節(jié)是簡單的增量值
插入數(shù)據(jù)(字段_id存在就報錯):db.集合名稱.insert(document)
插入數(shù)據(jù)(字段_id存在就更新):db.集合名稱.save(document)
舉個栗子:
#插入文檔時,如果不指定_id參數(shù),MongoDB會為文檔分配一個唯一的ObjectId db.xianyu.insert({name:"xianyuplus",age:"3"}) #插入文檔時,可以指定_id參數(shù) db.xianyu.insert({_id:"10001",name:"xianyuplus",age:"30"}) #更新了上面_id為1001的文檔 db.xianyu.save({_id:"10001",name:"xianyuplus",age:"40"})
查詢數(shù)據(jù):db.集合名稱.find()
舉個栗子:
db.xianyu.find()
更新數(shù)據(jù):db.集合名稱.update(
參數(shù)query:查詢條件 參數(shù)update:更新操作符 參數(shù)multi:可選,默認是false,表示只更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新
舉個栗子:
原有內(nèi)容: { "_id" : ObjectId("5b66f05f1194e110103bc283"), "name": "xianyuplus", "age": "40" } # 將name為xianyuplus的值替換為xianyuplus1 db.xianyu.update({name:"xianyuplus"},{name:"xianyuplus1"}) 操作后內(nèi)容: { "_id" : ObjectId("5b66f05f1194e110103bc283"), "name": "xianyuplus1" }
可以看到單單使用update更新數(shù)據(jù)會導(dǎo)致原有數(shù)據(jù)被新數(shù)據(jù)替換,所以我們應(yīng)該搭配$set使用,指定更新對應(yīng)的鍵值。
舉個栗子:
原有內(nèi)容: { "_id" : ObjectId("5b66f05f1194e110103bc283"), "name": "xianyuplus", "age": "40" } # 將name為xianyuplus的值更新為xianyuplus1 db.xianyu.update({name:"xianyuplus"},{$set:{name:"xianyuplus1"}}) 操作后內(nèi)容: { "_id" : ObjectId("5b66f05f1194e110103bc283"), "name": "xianyuplus1", "age": "40" }
更新多條數(shù)據(jù):使用參數(shù)multi:true
舉個栗子:
# 更新全部數(shù)據(jù)的name值為xianyuplus1 db.stu.update({},{$set:{name:"xianyuplus1"}},{multi:true})
注意:multi update only works with $ operators 即multi只要和$搭配使用時才能起效。
刪除數(shù)據(jù):db.集合名稱.remove(
參數(shù)query:可選,刪除的文檔的條件 參數(shù)justOne:可選,如果設(shè)為true或1,則只刪除一條,默認fals,表示刪除多條
舉個栗子:
# 把name值為xianyuplus的數(shù)據(jù)全部刪掉 db.xianyu.remove({name:"xianyuplus"})
查詢文檔:db.集合名稱.find({條件文檔})
查詢一條數(shù)據(jù):db.集合名稱.findOne({條件文檔})
格式化查詢:db.集合名稱.find({條件文檔}).pretty()
舉個栗子:
# 查詢name為xianyuplus的數(shù)據(jù) db.xianyu.find({name:"xianyuplus"}) # 查詢一條name為xianyuplus的數(shù)據(jù) db.xianyu.findOne({name:"xianyuplus"})
等于:如上述栗子
大于:$gt ( greater than )
大于等于:$gte ( greater than equal )
小于:$lt ( less than )
小于等于:$lte ( less than equal )
不等于:$nt ( not equal )
舉個栗子:
# 查詢age大于20的數(shù)據(jù) db.xianyu.find({age:{$gt:20}}) # 查詢age大于等于20的數(shù)據(jù) db.xianyu.find({age:{$gte:20}}) # 查詢age小于20的數(shù)據(jù) db.xianyu.find({age:{$lt:20}}) # 查詢age小于等于20的數(shù)據(jù) db.xianyu.find({age:{$lte:20}}) # 查詢age不等于20的數(shù)據(jù) db.xianyu.find({age:{$ne:20}})
and:在find條件文檔中寫入多個字段條件即可
or:使用$or
舉個栗子:
#查找name為xianyuplus且age為20的數(shù)據(jù) db.xianyu.find({name:"xianyuplus",age:20}) #查找name為xianyuplus或age為20的數(shù)據(jù) db.xianyu.find({$or:[{name:"xianyuplus"},{age:20}]}) #查找name為xianyuplus或age大于20的數(shù)據(jù) db.xianyu.find({$or:[{age:{$gt:20}},{name:"xianyuplus"}]}) #查找age大于等于20或gender為男并且name為xianyuplus的數(shù)據(jù) db.xianyu.find({$or:[{gender:"true"},{age:{$gte:18}}],name:"xianyuplus"})
使用$in與$nin判斷是否在某一范圍內(nèi)
舉個栗子:
#查詢年齡為18、28的數(shù)據(jù) db.xianyu.find({age:{$in:[]18,28}})
使用//或$regex編寫正則表達式
舉個栗子:
# 查詢name以xian開頭的數(shù)據(jù) db.xianyu.find({name:/^xianyu/}) db.xianyu.find({name:{$regex:'^xianyu'}})
查詢前n條數(shù)據(jù):db.集合名稱.find().limit(NUMBER)
跳過n條數(shù)據(jù):db.集合名稱.find().skip(NUMBER)
舉個栗子:
#查詢前3條數(shù)據(jù) db.xianyu.find().limit(3) #查詢3條后的數(shù)據(jù) db.xianyu.find().skip(3) #skip和limit可以搭配使用,查詢4,5,6條數(shù)據(jù) db.xianyu.find().skip(3).limit(3)
使用$where自定義查詢,這里使用的是js語法
舉個栗子:
//查詢age大于30的數(shù)據(jù) db.xianyu.find({ $where:function() { return this.age>30;} })
投影:在查詢結(jié)果中只顯示你想要看到的數(shù)據(jù)字段內(nèi)容。
db.集合名稱.find({},{字段名稱:1,...})
想顯示的字段設(shè)置為1,不想顯示的字段不設(shè)置,而_id這個字段比較特殊,想要他不顯示需要設(shè)置_id為0。
#查詢結(jié)果中只顯示name字段,不顯示age db.xianyu.find({},{name:1})
排序:db.集合名稱.find().sort({字段:1,...})
將需要排序的字段設(shè)置值:升序為1,降序為-1
舉個栗子:
#先按照性別降序排列再按照年齡升序排列 db.xianyu.find().sort({gender:-1,age:1})
統(tǒng)計數(shù)目:db.集合名稱.find({條件}).count()
db.集合名稱.count({條件})
舉個栗子:
#查詢age為20的數(shù)據(jù)個數(shù) db.xianyu.find({age:20}).count() #查詢age大于20,且性別為nan的數(shù)據(jù)個數(shù) db.xianyu.count({age:{$gt:20},gender:true})
去重:db.集合名稱.distinct('去重字段',{條件})
舉個栗子:
#去除家鄉(xiāng)相同,且年齡大于18的數(shù)據(jù) db.xianyu.distinct('hometown',{age:{$gt:18}})
聚合(aggregate)是基于數(shù)據(jù)處理的聚合管道,每個文檔通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾等功能,然后經(jīng)過一系列的處理,輸出相應(yīng)的結(jié)果。
用法:db.集合名稱.aggregate({管道:{表達式}})
常用管道:
$group: 將集合中的文檔分組, 可用于統(tǒng)計結(jié)果 $match: 過濾數(shù)據(jù), 只輸出符合條件的文檔 $project: 修改輸出文檔的結(jié)構(gòu), 如重命名、 增加、 刪除字段、 創(chuàng)建計算結(jié)果 $sort: 將輸出文檔排序后輸出 $limit: 限制聚合管道返回的文檔數(shù) $skip: 跳過指定數(shù)量的文檔, 并返回余下的文檔 $unwind: 將數(shù)組類型的字段進行拆分
常用表達式:表達式:"列名"
$sum: 計算總和, $sum:1 表示以一倍計數(shù) $avg: 計算平均值 $min: 獲取最小值 $max: 獲取最大值 $push: 在結(jié)果文檔中插入值到一個數(shù)組中 $first: 根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù) $last: 根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)
$group:將文檔進行分組以便于統(tǒng)計數(shù)目
用法:_id表示分組依據(jù),_id:"$字段名"
舉個栗子:
#按照hometown分組,并計數(shù) db.xianyu.aggregate({$group:{_id:"$hometown", count:{$sum:1}}}) #將集合中所有的內(nèi)容分為一組,統(tǒng)計個數(shù) db.xianyu.aggregate({$group:{_id:null, count:{$sum:1}}})
$project:修改輸入文檔的結(jié)構(gòu),如:重命名,增加、刪除字段等
舉個栗子:
#按照hometown分組,并計數(shù) #分組輸出,只顯示count字段 db.xianyu.aggregate( {$group:{_id:"$hometown", count:{$sum:1}}}, {$project:{_id:0,count:1}} )
$match:用于過濾數(shù)據(jù),只輸出符合條件的文檔,功能和find類似,但是match是管道命令,能將結(jié)果交給后一個管道,但是find不可以。
舉個栗子:
#查詢age大于20 #按照hometown分組,并計數(shù) #分組輸出,只顯示count字段 db.xianyu.aggregate( {$match:{age:{$gte:20}}}, {$group:{_id:"$hometown", count:{$sum:1}}}, {$project:{_id:0,count:1}} )
$sort:將輸入文檔排序后輸出
舉個栗子:
#查詢age大于20 #按照hometown分組,并計數(shù) #分組輸出,只顯示count字段 #按照計數(shù)升序排序 db.xianyu.aggregate( {$match:{age:{$gte:20}}}, {$group:{_id:"$hometown", count:{$sum:1}}}, {$project:{_id:0,count:1}}, {$sort:{count:1}} )
$limit:限制聚合管道返回的文檔數(shù)
$skip:跳過指定數(shù)量的文檔數(shù),返回剩下的文檔
舉個栗子:
#查詢age大于20 #按照hometown分組,并計數(shù) #按照計數(shù)升序排序 #跳過前一個文檔,返回第二個 db.xianyu.aggregate( {$match:{age:{$gte:20}}}, {$group:{_id:"$hometown", count:{$sum:1}}}, {$sort:{count:1}}, {$skip:1}, {$limit:1} )
$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條, 每條包含數(shù)組中的一個值
db.集合名稱.aggregate({$unwind:'$字段名稱'})
舉個栗子:
db.xianyu.insert({_id:1,item:'t-shirt',size:['S','M','L']}) db.xianyu.aggregate({$unwind:'$size'}) 輸出: { "_id" : 1, "item" : "t-shirt", "size" : "S" } { "_id" : 1, "item" : "t-shirt", "size" : "M" } { "_id" : 1, "item" : "t-shirt", "size" : "L" }
$group對應(yīng)的字典中有幾個鍵,結(jié)果中就有幾個鍵
分組依據(jù)需要放到_id后面
取不同的字段的值需要使用
,
‘
,`
,‘gender,$age`
取字典嵌套的字典中的值的時候$_id.country
能夠同時按照多個鍵進行分組
{$group:{_id:{country:"$字段",province:"$字段"}}}
結(jié)果是:{_id:{country:"",province:""}
用法:db.集合.ensureIndex({屬性:1}),1表示升序, -1表示降序
創(chuàng)建唯一索引:db.集合.ensureIndex({"屬性":1},{"unique":true})
創(chuàng)建唯一索引并消除:
db.集合.ensureIndex({"屬性":1},{"unique":true,"dropDups":true})
建立聯(lián)合索引:db.集合.ensureIndex({屬性:1,age:1})
查看當(dāng)前集合的所有索引:db.集合.getIndexes()
刪除索引:db.集合.dropIndex('索引名稱')
備份:mongodump -h dbhost -d dbname -o dbdirectory
-h: 服務(wù)器地址,也可以指定端口號 -d: 需要備份的數(shù)據(jù)庫名稱 -o: 備份的數(shù)據(jù)存放位置,此目錄中存放著備份出來的數(shù)據(jù)
恢復(fù):mongorestore -h dbhost -d dbname --dir dbdirectory
-h: 服務(wù)器地址 -d: 需要恢復(fù)的數(shù)據(jù)庫實例 --dir: 備份數(shù)據(jù)所在位置
安裝:pip install pymongo
導(dǎo)入模塊:from pymongo import MongoClient
實例化對象以鏈接數(shù)據(jù)庫,連接對象有host,port兩個參數(shù)。
from pymongo import MongoClient class clientMongo: def __init__(self): client = MongoClient(host="127.0.0.1", port=27017) #使用[]括號的形式選擇數(shù)據(jù)庫和集合 self.cliention = client["xianyu"]["xianyuplus"]
插入單條數(shù)據(jù):返回ObjectId
def item_inser_one(self): ret = self.cliention.insert({"xianyu":"xianyuplus","age":20}) print(ret)
插入多條數(shù)據(jù):
def item_insert_many(self): item_list = [{"name":"xianyuplus{}".format(i)} for i in range(10000)] items = self.cliention.insert_many(item_list)
查詢單條數(shù)據(jù):
def item_find_one(self): ret = self.cliention.find_one({"xianyu":"xianyuplus"}) print(ret)
查詢多條數(shù)據(jù):
def item_find_many(self): ret = self.cliention.find({"xianyu":"xianyuplus"}) for i in ret: print(i)
更新一條數(shù)據(jù):
def item_update_one(self): self.cliention.update_one({"xianyu":"xianyuplus"},{"$set":{"xianyu":"xianyu"}})
更新全部數(shù)據(jù):
def item_update(self): self.cliention.update_many({"xianyu":"xianyuplus"},{"$set":{"xianyu":"xianyu"}})
刪除一條數(shù)據(jù):
def item_delete_one(self): self.cliention.delete_one({"xianyu":"xianyuplus"})
刪除符合條件的數(shù)據(jù):
def item_delete_many(self): self.cliention.delete_many({"xianyu":"xianyuplus"})
【綻放吧!數(shù)據(jù)庫】有獎?wù)魑幕馃徇M行中:https://bbs.huaweicloud.com/blogs/285617
MongoDB Python 開發(fā)者 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。