mongoDB學習筆記

mongoDB簡介

MongoDB是用C++語言編寫的非關系型數據庫。特點是高性能、易部署、易使用,存儲數據十分方便,主要特性有:
面向集合存儲,易于存儲對象類型的數據
模式自由
支持動態查詢
支持完全索引,包含內部對象
支持復制和故障恢復
使用高效的二進制數據存儲,包括大型對象
文件存儲格式為BSON(一種JSON的擴展)

mongoDB 概念

image.png
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,除非自己定義,方可覆蓋

image.png

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

接下來,將更新mongoDB的主從復制,待續……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容