mongoDB簡介
MongoDB是用C++語言編寫的非關系型數據庫。特點是高性能、易部署、易使用,存儲數據十分方便,主要特性有:
面向集合存儲,易于存儲對象類型的數據
模式自由
支持動態查詢
支持完全索引,包含內部對象
支持復制和故障恢復
使用高效的二進制數據存儲,包括大型對象
文件存儲格式為BSON(一種JSON的擴展)
mongoDB 概念
1.database 數據庫
多個集合邏輯上組織在一起,就是數據庫。
數據庫命名規范:
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 應全部小寫。
- 最多64字節。
有一些數據庫名是保留的,可以直接訪問這些有特殊作用的數據庫。
- admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如列出所有的數據庫或者關閉服務器。
- local: 這個數據永遠不會被復制,可以用來存儲限于本地單臺服務器的任意集合
- config: 當Mongo用于分片設置時,config數據庫在內部使用,用于保存分片的相關信息。
2. collection 集合
多個文檔組成一個集合,相當于關系數據庫的表。
所有存儲在集合中的數據都是 BSON 格式,BSON 是類 JSON 的一種二進制形式的存儲格式,簡稱 Binary JSON。
集合名命名規范:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
- 集合名不能以"system."開頭,這是為系統集合保留的前綴。
-
用戶創建的集合名字不能含有保留字符。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。除非你要訪問這種系統創建的集合,否則千萬不要在名字里出現$。
image.png
3. document 文檔
MongoDB 將數據存儲為一個文檔,數據結構由鍵值對組成。
MongoDB 文檔是一組鍵值對(即BSON,二進制的 JSON),類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
文檔鍵命名規范:
- 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
- .和$有特別的意義,只有在特定環境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
需要注意的是:
- 文檔中的鍵值對是有序的。
- 文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
- MongoDB區分類型和大小寫。
- MongoDB的文檔不能有重復的鍵。
- 文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
4.mongoDB - 數據類型
ObjectId:主鍵,一種特殊而且非常重要的類型,每個文檔都會默認配置這個屬性,屬性名為_id,除非自己定義,方可覆蓋
mongoDB命令
1.創建數據存儲目錄
mongoDB將目錄存儲在db目錄下,需手動創建。
/Users/mrotaku/Desktop
2.開啟mongoDB的服務器
dbpath指定數據的存放位置,port指定端口號,關閉服務:ctrl + c
mongod --dbpath=/Users/mrotaku/Desktop/nosql --port 27017
3.數據庫常用命令
連接指定mongoDB
ctrl+c
關閉連接
mongo localhost:27017
查看當前數據庫
db
查看所有數據庫
mongoDB 中默認的數據庫為 test,如果你沒有創建新的數據庫,集合將存放在 test 數據庫中。
show dbs
連接指定數據庫
如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
use db_name
查看服務器狀態
db.serverStatus()
查看數據庫統計信息
db.stats()
刪除數據庫
db.dropDatabase()
查看數據庫中所有集合
show collections
或
show tables
清空集合
刪除里面的文檔,但集合還在
db.db_name.romve({})
刪除集合
db.db_name.drop()
查看集合詳細信息
db.db_name.find(key,value).explain("allPlansExecution")
mongoDB的增刪查改
1.添加
mongoDB使用insert()或者save()的方法向集合中插入數據
如果該集合不在該數據庫中, MongoDB 會自動創建該集合并插入文檔。
insert() 或 save() 方法都可以向collection里插入數據,兩者區別:
如果不指定 _id 字段,save() 方法類似于 insert() 方法。如果指定 _id 字段,則會更新該 _id 的數據。
使用save函數,如果原來的對象不存在,那他們都可以向collection里插入數據,如果已經存在,save會調用update更新里面的記錄,而insert則會忽略操作
insert可以一次性插入一個列表,而不用遍歷,效率高, save則需要遍歷列表,一個個插入。
例如向col集合中插入一條數據:
db.col_1.insert({
name:'zhangsan',
age:23,
phone:1877768121
})
第二種方式:
document = ({
name:'lisi',
age:19,
phone:15633577595
});
db.col_1.insert(document)
2.更新
mongoDB使用update語句更新集合中的文檔
db.collection.update(criteria,objNew,upsert,multi)
參數說明:
criteria:用于設置查詢條件的對象
objNew:用于設置更新內容的對象
upsert:如果記錄已經存在,更新它,否則新增一個記錄,取值為0或1
multi:如果有多個符合條件的記錄,是否全部更新,取值為0或1
注意:默認情況下,只會更新第一個符合條件的記錄
一般情況下后兩個參數分別為0,1 ,即:
db.collection.update(criteria,objNew,0,1)
$set 操作符為部分更新操作符,只更新 $set 之后的數據,而不是覆蓋之前的數據
-->將用戶名稱為"zhangsan"用戶的年齡更改為18
db.col_1.update({name:'zhangsan'},{$set:{age:18}})
以上語句只會修改第一條發現的文檔,如果要修改多條相同的文檔,則需要設置 multi 參數為 true。
db.col_1.update({name:'zhangsan'},{$set:{age:18}},{multi:true})
更新集合中的文檔,使用 $inc 將集合中name為user1的age加1,其它鍵不變, $inc表示使某個鍵值加減指定的數值
db.col_1.update({name:'zhangsan'},{$inc:{age:1}})
3.刪除
remove() 函數是用來刪除集合中的數據
在執行 remove() 函數前先執行 find() 命令來判斷執行的條件是否正確,這是一個比較好的習慣。
刪除集合中所有文檔
db.col_1.romve({})
移除集合中查詢到的數據的第一條
db.col_1.romve({name:'zhangsan'},1)
4.查詢
db.col_name.find(query, projection)
- query :可選,使用查詢操作符指定查詢條件
- projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。
find()方法,查詢返回集合中的所有文檔
db.col_1.find()
findOne(),查詢返回集合中的第一個文檔
db.col_1.findOne()
格式化輸出
db.col_1.find().pretty()
查詢文檔的個數
db.col_1.find().count()
跳過指定數量的數據
db.col_1.find().skip()
分頁查詢文檔
db.col_1.find().limit();
想要讀取從 10 條記錄后 100 條記錄,相當于 sql 中limit (10,100)。
db.col_1.find().skip(10).limit(100)
排序
sort()方法可以通過參數指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。
db.col_1.find().sort({key:1});
4.查詢+where語句
如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數據,你可以使用以下命令:
db.col_1.find({likes : {$lt :200, $gt : 100}})
// 類似于SQL語句:
Select * from col where likes>100 AND likes<200;
條件操作符 | 中文 | 全英文 |
---|---|---|
$gt | 大于 | greater than |
$gte | 大于等于 | greater than equal |
$lt | 小于 | less than |
$lte | 小于等于 | less than equal |
$ne | 不等于 | not equal |
5.AND 條件
find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,語法格式如下:
db.col_1.find({name:'zhangsan',age:18}).pretty()
6. OR 條件
db.col_1.find({$or:[{name:'zhangsan'},{age:20}]}).pretty()
7.AND 和 OR 聯合使用
db.col_1.find({"likes":{$gt:50},$or:[{age:20},{phone:15633577595}]}).pretty()
7.$exists()
$exists,用于查詢集合中存在某個鍵的文檔或不存在某個鍵的文檔,例如查詢col_1集合中存在name鍵的所有文檔
db.col_1.find({name:{$exists:1}})
8. $in和$nin
查詢年齡在18,19,20在這個區間的文檔
db.col_1.find({age:{$in:[18,19,20]}})
查詢年齡不在18,19,20在這個區間的文檔
db.col_1.find({age:{$nin:[18,19,20]}})
MongoDB - 索引
索引就是用來加速查詢的。數據庫索引與書籍的索引類似:有了索引就不需要翻遍整本書,數據庫則可以直接在索引中查找,使得查找速度能提高幾個數量級。在索引中找到條目以后,就可以直接跳轉到目標文檔的位置。
1. 查看索引
getIndexes 查看集合索引情況
db.col_1.getIndexes()
db.collection.stats() 查看索引狀態
db.col_1.stats()
2. 創建索引
創建普通索引,使用命令 db.collection.ensureIndex({key:1})
db.col_1.ensureIndex({key:1})
3. 刪除索引
刪除索引(不會刪除 _id 索引)
db.col_1.dropIndexes()
db.col_name.dropIndex({key: 1})
4. _id索引
對于每個插入的數據,都會自動生成一條唯一的 _id 字段,_id 索引是絕大多數集合默認建立的索引
> db.col_1.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.col_1.find()
{ "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 }
> db.col_1.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "runoob.col_1"
}
]
字段解釋:
v 表示 version,在 Mongo3.2 之前的版本中,會存在 {v:0}(版本鎖為0)的情況。在3.2之后的版本中,{v:0} 不再允許使用,這部分可以不去關注,因為 v 由系統自動管理
key 表示作為索引的鍵。1 或 -1表示排序模式,1為升序,1為降序
name 表示索引的名字,默認生成名稱的規則是作為索引的字段_排序模式
ns 表示 namespace 命名空間,由數據庫名稱.集合名稱組成
5.多鍵索引
單鍵索引的值為一個單一的值,多鍵索引的值有多個數據(如數組)
如果mongoDB中插入數組類型的多鍵數據,索引是自動建立的,無需刻意指定
> db.col_1.insert({z:[1,2,3,4,5]})
WriteResult({ "nInserted" : 1 })
> db.col_1.find()
{ "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 }
{ "_id" : ObjectId("5965923eaaf42d1c98dd95a3"), "y" : 20 }
{ "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] }
> db.col_1.find({z:3})
{ "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] }
6.符合索引
同時對多個字段創建索引
> db.col_2.insert({x:10,y:20,z:30})
WriteResult({ "nInserted" : 1 })
> db.col_2.find()
{ "_id" : ObjectId("59659a57aaf42d1c98dd95a5"), "x" : 10, "y" : 20, "z" : 30 }
> db.col_2.createIndex({x:1,y:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.col_2.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "runoob.col_2"
},
{
"v" : 2,
"key" : {
"x" : 1,
"y" : 1
},
"name" : "x_1_y_1",
"ns" : "runoob.col_2"
}
]
7.全文索引
場景:全網站關鍵詞搜索
key-value 中,key 此時為 $**(也可以是具體某 key),value 此時為一個固定的字符串(如 text)
全文索引相似度,與 sort 函數一起使用效果更好
db.col_1.find({ $text: { $search: "aa bb" } }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } })
注意:
- 每個集合只能創建一個全文索引
- MongoDB 從 2.4 版本開始支持全文檢索,從 3.2 版本開始支持中文
(好像)只能對整個單詞查詢,不能對單詞的截取部分查詢 - 關鍵詞之間的空格表示或
- 關鍵詞之前的 - 表示非
- 關鍵詞加引號表示與 (需用 \ 轉義)
MongoDB - 備份與恢復
MongoDB提供了備份和恢復的功能,分別是MongoDB下載目錄下的mongodump.exe和mongorestore.exe文件
備份數據庫
備份數據使用下面的命令:
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目錄,這個目錄里面存放該數據庫實例的備份數據。
mongodump -h 127.0.0.1:27017 -d hrabbit -o /Users/mrotaku/Desktop/dump
恢復數據庫
恢復數據使用下面的命令:
mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:MongoDB所在服務器地址
-d:需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
-directoryperdb:備份數據所在位置,例如:c:\data\dump\test
mongorestore -h 127.0.0.1:27017 -d hrabbit -directoryperdb /Users/mrotaku/Desktop/dump
導出數據
導出數據可以使用命令:
mongoexport -h dbhost -d dbname -c collectionName -o output
參數說明:
-h 數據庫地址
-d 指明使用的庫
-c 指明要導出的集合
-o 指明要導出的文件名
mongoexport -h127.0.0.1:27017 -dhrabbit -c col_1 -o output
導入數據
導出數據可以使用命令:
mongoimport -h dbhost -d dbname -c collectionname 文件的地址...
參數說明:
-h 數據庫地址
-d 指明使用的庫
-c 指明要導入的集合
本地的文件地址...
mongoimport -h 127.0.0.1:27017 -d hrabbit -c col_2 /Users/mrotaku/Desktop/dump/hrabbit/c1.bson
安全和認證
每個MongoDB實例中的數據庫都可以有許多用戶。如果開啟了安全性檢查,則只有數據庫認證用戶才能執行讀或者寫操作。
在認證的上下文中,MongoDB會將普通的數據作為admin數據庫處理。admin數據庫中的用戶被視為超級用戶(即管理員)。
在認證之后,管理員可以讀寫所有數據庫,執行特定的管理命令,如listDatabases和shutdown。
在開啟安全檢查之前,一定要至少有一個管理員賬號。
use admin;
db.addUser(“root”,”root”);
在col_1 中創建普通賬號:
use col_1;
db.addUser(“zhangsan”,”123”);
db.addUser(“lisi”,”123”,true);
注意:用戶lisi,密碼為123,對col_1數據庫擁有讀寫權限
用戶zhangsan,密碼為123,對col_1數據庫擁有只讀權限
重新啟動數據庫服務,并開啟安全檢查:
mongod --dbpath /Users/mrotaku/Desktop/nosql --auth