一、MongoDB 概念解析
-
什么是MongoDB? ? 1、MongoDB是有C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統,在高負載的情況下,添加更多節點,可以保證服務器的性能 ? 2、MongoDB為web應用提供了高性能的數據存儲解決方案 ? 3、MongoDB將數據存儲為一個文檔,數據結構由(key->value)形式組層,MongoDB文檔類似于json文件,字段值可以是其他文檔,列表等
-
JSON文件
存儲數據的一種格式
{}:代表字典[]:列表,:分隔兩個部分::鍵值對{"code": 1,"totle": 3,"pers": [{"name":"tom1","age":18},{"name":"tom2","age":19 ? ? ? ? ? ?},{"name":"tom3","age":17 ? ? ? ? ? ?}]}
-
特點
1、MongoDB提供了一個面向文檔存儲,基本思路是將原來的“行”的概念換成了更加領過的“文檔”模型,一條記錄可以表示非常復雜的層次關系 2、MongoDB支持豐富的查詢表達式,查詢指令是json形式的標記,可以輕易查詢文檔中嵌套的對象和列表 3、非常容易擴展,擴展集群后還可以實現集群中的數據的負載均衡。 4、MongoDB支持各種編程語言,比如python、Java、c++、c、php、c#、ruby、JavaScript等 5、豐富的功能,包括索引、存儲JavaScript、聚合、固定集合、文件存儲等功能 6、方便管理,處理啟動數據庫服務以外,記過沒有其他什么必要的操作。管理集群只需要知道有哪個新增的節點即可,自動繼承和配置新節點
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 表/集合 |
row | document | 行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table joins | ? | 表關聯/MongoDB不支持 |
primary key | primary key | 主鍵索引/mongodb自動將_id設置為主鍵索引 |
二、 MongoDB創建數據庫
(1) 安裝mongoDB
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
?
#下面命令針對ubuntu16.04版本,在其他ubuntu版本系統請查看MongoDB官網
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt update
sudo apt install -y mongodb-org
?
查看服務是否啟動
pgrep mongo -l
?
#查看版本
mongo -version
?
手動啟動
mongod
或者
sudo service mongod start | stop | restart
(2) 進入 MongoDB數據庫
> mongo
?
三、 對于庫的操作 database
一個MongoDB服務器中可以建立多個數據庫,系統保留數據庫包括:
-
admin 從權限的角度考慮,這是“root”數據庫,要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限,一些特定的數據庫服務端的命令只有能從這個數據庫運行,比如列出所有的數據庫或者關閉服務
-
local 這個數據庫永遠不會被復制,用來存儲僅限于本地單臺服務器的一些集合
-
config 當MongoDB用于分片設置時,config數據庫在內部使用,用于保存分片的相關數據
數據庫命名規范:
-
不能是空字符串("")
-
不得含有' '(空格)、.、$、/、\和\0 (空字符)
-
應全部小寫
(1) 創建庫
use 庫名
注意:
-
當use一個不存在的庫的時候 其實這個庫已經創建出來了 但是里面沒有數據 使用show dbs的時候 ,該庫不會顯示
-
mongodb嚴格區分大小寫
-
數據庫名字不要用admin、local和config
在MongoDB里 不管是什么操作 都是db。
語法:db.getName() ?獲取當前的所在的庫
語法:db ? ? ?獲取當前所屬的庫
(2) 刪除數據庫
-
刪除數據庫之前最好use一下 確定自己所在哪個庫下
語法:db.dropDatabase()
(3) 查看所有的庫
語法:show dbs
四、 對于集合的操作 collection
集合相當于關系型數據庫中的表,但集合中的數據不必是同一種類型,可以是不同種類型。
-
集合的名稱不能以system.開頭
-
名稱不能是保留字
-
名稱不能是空字符
(1) 創建集合(也就是創建表)
語法:db.createCollection('集合名稱')
示例:db.createCollection('user') #在當前的庫里面創建一個空user集合
?
語法:db.集合名稱.insert(文檔)
示例:db.student.insert({name:'tom',age:20}) #創建一個student集合并插入了一個文檔
(2) 刪除集合
語法:db.集合名.drop()
示例:db.user.drop() #刪除user集合
(3) 顯示所有集合
語法:show collections
五、 文檔操作
文檔是MongoDB中最核心的概念,是其核心單元,將文檔類比成關系型數據庫中的每一行數據 多個鍵及其關聯的值有序的放在一起就是文檔,MongoDB使用了Bson數據結構來存儲數據和網絡數據交換 BSON數據可以理解為在JSON的基礎上添加了一些json沒有的數據類型
MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
?
注意:
-
文檔的鍵/值對是有順序的
-
文檔的鍵不能重復,如果重復,后面的會覆蓋前面的鍵
-
MongoDB區分大小寫和類型
-
文檔中的鍵一般是字符串
文檔命名規范
-
文檔的鍵區分大小寫
-
文檔的鍵不要使用\0和$
5.1 插入文檔
(1) insert的插入一條文檔
語法:db.集合名.insert(文檔)
示例:db.user.insert({name:'tom',age:20})
(2) insert 插入多條文檔
語法:db.集合名.insert([文檔1,文檔2,...文檔2])
示例:db.user.insert([{name:'武大郎',age:30},{name:'和珅',age:20}])
-
注意:如果沒有中括號 那么只會將第一條數據 插入成功
(3) save
語法:db.集合名.save(文檔)
說明:如果不指定_id字段,save()方法類似于insert()方法。如果指定_id字段,則會更新_id字段的數據
示例1:db.student.save({name:"科比", age:22,address:"洛杉磯"})
示例2:db.student.save({_id:ObjectId("59950962019723fe2a0d8d17"),name:"姚明", age:23,address:"休斯頓"})
(4)3.2版本以后 建議使用
語法:db.collection.insertOne()
示例:db.user.insertOne({name:'蕭峰',age:30})
?
語法:db.collection.insertMany()
示例:db.user.insertMany([{name:'武大郎',age:30},{name:'和珅',age:20}])
5.2 REMOVE文檔刪除
語法:
db.collection.remove(<query>,<justOne>
)
參數說明:query:可選,刪除的文檔的條件justOne:可選,如果為true或1,則只刪除一個文檔
示例:db.user.remove({name:'武大郎'},1) #會刪除第一個匹配到的文檔db.user.remove({name:"張三"}) ? ? #刪除多條文檔db.collection.remove({}) ? #刪除當前集合的全部文檔
-
3.2版本以后 建議使用
-
db.collection.deleteOne() #刪除一條文檔
-
db.collection.deleteMany() #刪除多條文檔
-
5.3 update 修改
語法:db.collection.update(條件,修改的操作,{upsert:bool,multi:bool}) ?
說明:upsert:可選,如果不存在修改的記錄,是否當新數據插入,true為插入,False為不插入,默認為falsemulti:可選,默認是false,只更新找到的第一條記錄;如果為true,就按照條件查找出來的數據全部更新
示例:$set ? 直接修改$inc ? 累加修改
db.user.update({name:"潘金蓮"},{$set:{age:20}}) ? #把name為潘金蓮的文檔的age直接改為20 ?
db.user.update({name:"潘金蓮"},{$inc:{age:20}}) #把name為潘金蓮的文檔的age加上20
全部修改:db.user.update({name:"王五"},{$inc:{age:3}},{multi:true})
-
3.2版本以后 建議 updateOne() 只更新一條 updateMany() 更新多條
5.4 FIND 查詢
(1) 基本查詢
語法:db.collection.find() 查詢所有
語法:db.collection.find({條件},{key:1 [,key2:1]}) 按照條件來查詢 設置為1則顯示
語法:db.collection.find({條件},{key1:0[,key2:0]}) 按照條件來查詢 設置為0則不顯示
?
示例:db.user.find({name:"王五"},{name:1}) #查詢所有name為王五的文檔 只顯示name的值
示例:db.user.find({name:"王五"},{name:0}) #查詢所有name為王五的文檔 顯示name鍵值對以外的所有的值
示例:db.user.find({},{key:1}) #條件是 查詢所有 只顯示某個鍵值對
-
注意:
錯誤寫法:db.user.find({name:"王五"},{age:1,name:0}) 要么指定顯示,要么指定不顯示,不可以混合
正確寫法:db.user.find({name:"王五"},{_id:0,name:1}) #id隱藏,只顯示name的鍵值對,除了設置系統的_id 可以混搭外 其它都不可以
(2) findOne 查詢一條數據
語法:db.collection.findOne({條件},{key1:1[key:1]})
示例:db.user.findOne({name:'和珅'},{name:1})
(3) pretty 展開顯示
db.collection.find().pretty() #只有當文檔一行顯示不下(比較長的時候) 會展開顯示
(4) 統計count
db.collection.find().count() 統計所有文檔的條數
db.user.find({name:"王五"}).count() 統計滿足條件的文檔的條數
(5) 條件運算
操作符 | 說明 | 使用 |
---|---|---|
$gt | 大于 | db.user.find({age:{$gt:30}},{age:1})年齡>30 |
$gte | 大于等于 | db.user.find({age:{$gte:30}},{age:1})年齡>=30 |
$lt | 小于 | db.user.find({age:{$lt:30}},{age:1})年齡<30 |
$lte | 小于等于 | db.user.find({age:{$lte:30}},{age:1})年齡<=30 |
鍵:值 | 等于 | db.user.find({age:30}) |
? | >= and <= | db.user.find({age:{$gte:25 ,$lte:35 }}) |
_id:objectId() | id來查詢 | db.user.find({"_id" : ObjectId("5a162218fa08a5e7ad2ad09c")}) |
/數據/ | 模糊查詢 | db.user.find({name:/李/}) 名字包含李的 |
/^數據/ | 以數據作為開頭 | db.user.find({name:/^李/}) |
/數據$/ | 以數據作為結尾 | db.user.find({name:/五$/}) |
$in | 在...范圍之內 | db.user.find({age:{$in:[23,30]}}) |
$nin | 不在...范圍之內 | db.user.find({name:{$nin:['王五','趙六']}}) |
$ne | 不等于 | db.user.find({name:{$ne:'王五'}}) |
(6)邏輯運算
1.and ? 邏輯與查詢
語法:db.集合名.find({條件1,條件2,……,條件n})
示例:db.user.find({name:'趙六',age:54}) 查詢 name為趙六 并且 age為54的文檔db.user.find({name:"趙六",age:{$gt:40}}) 查詢name為趙六 并且年齡大于40
2.or 邏輯或
語法:db.集合名.find({$or:[{條件1},{條件2},……,{條件n}]})
示例:db.user.find({$or:[{name:"王五"},{age:40}]}) 查詢name為王五 或者age為40的文檔db.user.find({$or:[{name:"王五"},{name:"趙六"}]}) 查詢name為王五或者趙六的所有文檔
3. and和or聯合使用
語法: db.collection.find( { 條件1,條件2,... $or:[ {條件1} , {條件2}] })
示例:db.user.find({name:"王五",$or:[{age:30},{age:40}]})查詢name為 王五 年齡為30或者40的所有文檔
db.user.find({name:'XAD',$or:[{age:66},{age:68}]})
#name='XAD' and (age = 66 or age =68)
(7) limit 和skip
limit用法:
語法:db.collection.find().limit(num) #取前num條數據
示例:db.user.find().limit(3) ? #取三條數據
?
skip用法
語法:db.collection.skip(num) ? #跳過num條文檔
示例:db.user.find().skip(9) #跳過9條數據
?
skip 和 limit 配合使用 是分頁技術的基礎
語法:db.collection.find().skip(num).limit(num)
示例:db.user.find().skip(8).limit(1) ? #跳過8條數據 取1條, 其實就是實現了limit m,n
(8) 排序sort
語法:db.collection.find().sort(key:1/-1) #按照key的升序(1)/降序(-1) ?
示例:db.user.find().sort({age:-1}) ? 按照年齡 降序顯示db.user.find().sort({age:-1}).limit(1) #取出一條年齡最大的文檔
六、 數據庫的備份
(1) 備份
語法:mongodump -h 主機 -u 用戶名 -p 密碼 -d 數據庫 -c 集合 -o 備份目錄
示例:mongodump -d bbs -o ./ 備份bbs庫到當前目錄,會生成一個和庫名相同的目錄mongodump -o ./ 備份所有數據庫
導出集合為json文件:mongoexport -d bbs -c user -o ./user.json
(2) 恢復
語法:mongorestore --drop -d dir/ 恢復所有庫 ? --drop是當恢復時先把之前的數據刪除,不建議使用
語法:mongorestore -d mydbdir/ ? mydbdir就是你數據庫備份的目錄
語法:mongorestore -d mydb -c test dir/mydb/test.bson 恢復集合