mongodb安裝與常用命令
NoSQL Mongodb
- 下載mongodb的版本,兩點注意
- 根據業界規則,偶數為穩定版,如1.6.X,奇數為開發版,如1.7.X
- 32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制
效能
BSON格式的編碼和解碼都是非常快速的。它使用了C風格的資料表現形式,這樣在各種語言中都可以高效地使用。
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。d
一、MongoDB 概念解析
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 資料庫表/集合 |
row | document | 資料記錄行/文件 |
column | field | 資料欄位/域 |
index | index | 索引 |
table joins | 表連線,MongoDB不支援 | |
primary key | primary key | 主鍵,MongoDB自動將_id欄位設定為主鍵 |
二、安裝
下載mongodb的版本,兩點注意
- 根據業界規則,偶數為穩定版,如1.6.X,奇數為開發版,如1.7.X
- 32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制
一, MongoDB與安裝(windows)
首先去官網下載MongoDB的安裝包, https://www.mongodb.com/try/download/community
將mongodb目錄下的bin資料夾新增到環境變數
對於mac的安裝可以使用homebrew安裝. 或參考這裡https://www.runoob.com/mongodb/mongodb-osx-install.html
三、資料型別
- 下表為MongoDB中常用的幾種資料型別:
- Object ID:文件ID
- String:字串,最常用,必須是有效的UTF-8
- Boolean:儲存一個布林值,true或false
- Integer:整數可以是32位或64位,這取決於伺服器
- Double:儲存浮點值
- Arrays:陣列或列表,多個值儲存到一個鍵
- Object:用於嵌入式的文件,即一個值為一個文件
- Null:儲存Null值
- Timestamp:時間戳
- Date:儲存當前日期或時間的UNIX時間格式
需要注意的是:
- 文件中的鍵/值對是有序的。
- 文件中的值不僅可以是在雙引號裡面的字串,還可以是其他幾種資料型別(甚至可以是整個嵌入的文件)。
- MongoDB區分型別和大小寫。
- MongoDB的文件不能有重複的鍵。
- 文件的鍵是字串。除了少數例外情況,鍵可以使用任意UTF-8字元。
文件鍵命名規範:
- 鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
- .和$有特別的意義,只有在特定環境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
四、連結Mongodb
(1) cd mongo安裝的目錄/bin
輸入 mongod.exe --dbpath=路徑
(2) 重新啟動一個Windows的終端 再次進入到 mongo安裝的目錄/bin
cd mongo安裝的目錄/bin
mongo.exe #此刻 進入到Mongodb資料庫了
五、 對於庫的操作
(1) 檢視所有的庫
show dbs
(2) 選擇資料庫 (如果使用的資料庫存在 則使用 不存在 則建立)
use 庫名
注意:
新建立的資料庫 預設你是看不到的 可以使用db/db.getName() 去檢視當前所在的庫 往新的庫裡建立集合
(3) 檢視當前所在的資料庫
1. db
2. db.getName()
(4) 建立集合(也就是建立表)
-
db.createCollection("集合名")
例如:db.createCollection("user") #建立一個user的集合 在當前的庫裡
-
db.集合名.insert(文件) #如果 當前的集合名不存在 那麼就建立該集合 並插入文件(資料)
注意:
1. 在庫裡對於文件 集合的操作 統一使用db. (db代表當前的庫)
2. 嚴格區分大小寫
(5) 檢視當前庫下的所有集合
show collections
(6) 刪除集合
db.集合名.drop()
六、INSERT/SAVE文件的新增
(1) 使用insert 如果是新增資料 建議使用 insert
db.集合名.insert(文件) #如果是新增資料 建議使用 insert
插入多條資料:
db.集合名.insert([文件]) #注意 一定要加[] 否則可能只會把 第一條文件插入進去
3.2 版本後還有以下幾種語法可用於插入文件:
- db.collection.insertOne():向指定集合中插入一條文件數z據
- db.collection.insertMany():向指定集合中插入多條文件資料
(2) 使用save
-
db.集合名.save(文件) #新新增 一個文件
-
db.集合名.save({_id:ObjectId("59a385d4a356cb252c1dcd73"),文件}) #對原有的資料進行覆蓋
db.user.save({_id:ObjectId("59a385d4a356cb252c1dcd73"),name:"王五"})
七、FIND 查詢
(1) find 查詢所有
db.集合名.find([條件],{key1:1[,[key2:1]]}) #查詢所有的資料 代表 顯示哪些欄位名
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
注意:
兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應返回)
db.collection.find(query, {title: 1, by: 0}) // 錯誤
_id 鍵預設返回,需要主動指定 _id:0 才會隱藏
只能全1或全0,除了在inclusion模式時可以指定_id為0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確
(2) findOne() 查詢一條
db.集合名.findOne([條件],{key1:1[,[key2:1]]}) #查詢一條資料 代表 顯示哪些欄位名
(3) count 統計資料條數
db.集合名.find([條件]).count()
(4) pretty() 展開來檢視
db.集合名.find([條件]).pretty()
(5) 查詢條件的操作符
符號 | 符號說明 | 例項 | 說明 |
---|---|---|---|
$gt | 大於 | db.user.find({age:{$gt:18}}) | 年齡大於18 的 |
$gte | 大於等於 | db.user.find({age:{$gte:18}}) | 年齡大於等於18的 |
$lt | 小於 | db.user.find({age:{$lt:18}}) | 年齡小於18 |
$lte | 小於等於 | db.user.find({age:{$lte:18}}) | 年齡小於等於18 |
{key:value} | 等於 | db.user.find({age:18}) | 年齡等於18 |
{ "_id" : ObjectId("5c2caba840b9441054372217")} | 使用id查詢 | db.user.find({ "_id" : ObjectId("5c2caba840b9441054372217")}) | 查詢id為"5c2caba840b9441054372217"文件 |
/值/ | 模糊查詢 | db.user.find({username:/小/}) | 查詢年齡中包含小字的文件 |
/^值/ | 以...作為開頭 | db.user.find({username:/^小/}) | 查詢username中以小字作為開頭的文件 |
/值$/ | 以...作為結尾 | db.user.find({username:/小$/}) | 查詢username中以小字作為結尾的文件 |
$in | 在...內 | db.user.find({age:{$in:[18,20,30]}) | 查詢年齡在18,20,30的文件 |
$nin | 不在...內 | db.user.find({age:{$nin:[18,20,30]}}) | 查詢年齡不在 1,20,30的文件 |
$ne | 不等於 != | db.user.find({age:{$ne:18}}) | 查詢年齡不為18的文件 |
(6) AND 查詢
db.col.find({key1:value1, key2:value2}).pretty()
db.集合名.find({條件一,條件二,,,})
例如:
db.user.find({name:"張三",age:{$gt:10}}) #查詢name為張三的 且 年齡 大於10歲的
db.user.find({name:"張三",age:10}) #查詢name為張三的 且 年齡為10歲的
db.user.find({name:"張三",age:{$gte:10,$lte:28}}) #name為張三 年齡 大於等於10 小於等於28
(7) OR 查詢
db.集合名.find({$or:[{條件一},{條件二},,,]})
例如:
db.user.find({$or:[{name:"張三"},{name:"趙六"}]}) #查詢name為張三 或者為趙六的所有資料
db.col.find({$or:[{"by":"lucky"},{"title": "MongoDB 教程"}]}).pretty()
(8) AND 和 OR 的使用
db.集合名.find({條件一,,,$or:[{條件1},{條件2}]})
例如:
db.user.find({name:"張三",$or:[{age:10},{age:28}]}) #name為張三 年齡為10歲或者28歲的所有資料
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
(9) LIMIT 取值
db.集合名.find().limit(num) #從第0個開始取幾個
例如:
db.user.find().limit(5) #從0開始取5條資料
(10) skip 跳過幾個
db.集合名.find().skip(num) #跳過幾條資料
例如:
db.user.find().skip(2) #從第三條資料 取到最後
(11) limit skip 配合使用
db.集合名.find().skip().limit(num)
例如:
db.user.find().skip(2).limit(2) #從第三個開始 取2個
(12) SORT 排序
在MongoDB中使用使用sort()方法對資料進行排序,sort()方法可以通過引數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用於降序排列。
db.集合名.find().sort({key:1|-1}) #升序或者降序
例如:
db.user.find().sort({age:1}) #查詢所有資料 按照年齡 升序
db.user.find().sort({age:-1}) #查詢所有資料 按照年齡 降序
八、UPDATE 文件的修改
結構:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)u
- **query **: update的查詢條件,類似sql update查詢內where後面的。
- **update **: update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
- **upsert **: 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
- **multi **: 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新
(1) 更新操作符 $set直接修改 $inc累加修改
-
db.集合名.update(條件,資料,{multi:true}) 更改
db.user.update({name:"張三"},{$inc:{age:5}}) #修改name為張三的文件 將age在原有的基礎上 加5
db.user.update({name:"張三"},{$set:{age:5}}) #修改name為張三的文件 將age的值 修改為5
db.user.update({name:"張三"},{$set:{age:5}},{multi:true}) #將所有name為張三的文件 的年齡 全部修改為 5
-
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
-
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
-
只新增第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
(2) 刪除集合中所有文件的一個域
-
db.posts.update({}, { $unset: { deleted_at: 1 } }, { multi: true })
1.第一個引數表示選中某些文件,這裡為 {} 表示選中當前 posts 集合中的所有文件
2.第二個引數為具體的更新操作,$unset 表示刪除域
3.第三個引數為額外選項,{ multi: true } 表示更新所有滿足要求的文件,預設只會更新第一個 -
也可以同時刪除多個域 程式碼如下:
db.categories.update({}, { $unset: { deleted_at: 1, desc: 1 } }, { multi: true })也以同時刪除和新增域 程式碼如下:
db.tags.update( {}, { $unset: { deleted_at: 1 }, $set: { slug: 1, description: 1 } }, { multi: true } )
-
3.2版本以後
updateOne() 更新一條
updateMany(query,update,true/false) 更新多條 第三個引數為upsert:true/false
九、REMOVE 文件的刪除
主體結構
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
(1)引數說明:
- **query **:(可選)刪除的文件的條件。
- **justOne **: (可選)如果設為 true 或 1,則只刪除一個文件。
- **writeConcern **:(可選)丟擲異常的級別。
(2) 主體結構
db.集合名.remove(條件) #預設將所有都匹配到的資料進行刪除
db.集合名.remove(條件,1) #只刪除 第一個匹配到的資料
db.集合名.remove(條件,,{justOne:true}) #只刪除 第一個匹配到的資料
db.t.remove({price:{$gte:16},price:{$lte:32}}) #刪除 價格在 16-32之間的所有資料
db.col.remove({}) 清空集合 "col" 的資料
(3) 3.2 版本後還有以下幾種語法可用於刪除文件:
remove() 方法已經過時了,現在官方推薦使用
deleteOne() 刪除一條
deleteMany() 刪除多條
十、建立索引 ensureIndex() 方法
MongoDB使用 ensureIndex() 方法來建立索引。
(1) 語法
ensureIndex()方法基本語法格式如下所示:
>db.COLLECTION_NAME.ensureIndex({KEY:1})
語法中 Key 值為你要建立的索引欄位,1為指定按升序建立索引,如果你想按降序來建立索引指定為-1即可。
(2) 例項
>db.col.ensureIndex({"title":1})
ensureIndex() 方法中你也可以設定使用多個欄位建立索引(關係型資料庫中稱作複合索引)。
>db.col.ensureIndex({"title":1,"description":-1})
十一、資料庫刪除與退出
(1) 資料庫刪除
- 刪除之前 最好use一下
- db.dropDatabase()
(2) 資料庫的退出
exit
十三、MongoDB 備份(mongodump)與恢復(mongorestore)
備份:
>mongodump -h dbhost -d dbname -o dbdirectory
- -h:MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
- -d:需要備份的資料庫例項,例如:test
- -o:備份的資料存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫例項的備份資料。
在本地使用 27017 啟動你的mongod服務。開啟命令提示符視窗,進入MongoDB安裝目錄的bin目錄輸入命令mongodump:
>mongodump -h127.0.0.1 -ddemo -o C:\mongodb
MongoDB資料恢復
mongorestore命令指令碼語法如下:
>mongorestore -h <hostname><:port> -d dbname <path>
- --host <:port>, -h <:port>:MongoDB所在伺服器地址,預設為: localhost:27017
- --db , -d :需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
- --drop:恢復的時候,先刪除當前資料,然後恢復備份的資料。就是說,恢復後,備份後新增修改的資料都會被刪除,慎用哦!
-
: mongorestore 最後的一個引數,設定備份資料所在位置,例如:c:\data\dump\test。你不能同時指定和 --dir 選項,--dir也可以設定備份目錄。 -
--dir:指定備份的目錄你不能同時指定
和 --dir 選項。
mongodb使用 mongorestore 命令來恢復備份的資料。
mongorestore -h127.0.0.1 -ddemo C:\mongodb\demo(備份資料所在的位置)
注意:
不管是備份還是恢復資料 都先將服務執行起來 再次新建終端 來執行備份或者恢復的命令