mongodb簡單實用

客戶端
https://robomongo.org/


連接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 這是固定的格式,必須要指定。
username:password@ 可選項,如果設置,在連接數據庫服務器之后,驅動都會嘗試登陸這個數據庫
host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連接服務器的地址。如果要連接復制集,請指定多個主機地址。
portX 可選的指定端口,如果不填,默認為27017
/database 如果指定username:password@,連接并驗證登陸指定數據庫。若不指定,默認打開 test 數據庫。
?options 是連接選項。如果不使用/database,則前面需要加上/。所有連接選項都是鍵值對name=value,鍵值對之間通過&或;(分號)隔開


創建數據庫
use DATABASE_NAME
如果有則切換到數據庫,沒有則創建,數據庫需要插入數據才能夠顯示。
示例:
> use test
switched to db runoob
> db
test

插入數據
數據庫需要有數據才能夠顯示
db.collectionName.insert({"name":"close"})
刪除數據庫
>use db
>db.dropDatabase()
查看所有數據庫
show dbs


創建集合
[語法格式]
db.createCollection(name, options)
建固定集合 mycol,整個集合空間大小 6142800 KB, 文檔最大個數為 10000 個
db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

options固定格式
字段  類型  描述
capped  布爾  (可選)如果為 true,則創建固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文檔。當該值為 true
時,必須指定 size 參數。
autoIndexId 布爾  (可選)如為 true,自動在 _id 字段創建索引。默認為 false。
size    數值  (可選)為固定集合指定一個最大值,以千字節計(KB)。如果 capped 為 true,也需要指定該字段。
max 數值  (可選)指定固定集合中包含文檔的最大數量。

刪除集合
db.collection.drop()
[ 注釋:db.[collectionName].drop()]


插入
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:
db.COLLECTION_NAME.insert(document)
插入文檔你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會更新該 _id 的數據。

>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 數據庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

3.2版本以后新增插入命令
db.collection.insertOne():向指定集合中插入一條文檔數據
[var res = db.collection.insertMany([{"b": 3}])]
db.collection.insertMany():向指定集合中插入多條文檔數據
[var res = db.collection.insertMany([{"b": 3}, {'c': 4}])]

還可以定義數組一次性插入

var arr = [];
for(var i=1 ; i<=20000 ; i++){
    arr.push({num:i});
}
db.numbers.insert(arr);

更新
db.collection.update(
<query>,
<update>,
{
name: <value>,
}
)

參數說明:

query : update的查詢條件,類似sql update查詢內where后面的。
update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set后面的
upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級別。

示例
只更新第一條記錄:
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 );
全部添加進去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );


刪除文檔
remove() 方法的基本語法格式如下所示:(方法已過時,因為remove() 方法 并不會真正釋放空間。需要繼續執行 db.repairDatabase()或者db.runCommand({ repairDatabase: 1 }) 來回收磁盤空間。)
db.collection.remove(
<query>,
<justOne>,
writeConcern: <document>
)

參數說明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設為 true 或 1,則只刪除一個文檔,如果不設置該參數,或使用默認值 false,
則刪除所有匹配條件的文檔。
writeConcern :(可選)拋出異常的級別。

新版方法
deleteOne(),deleteMany

示例
刪除 status 等于 A 的全部文檔:
db.inventory.deleteMany({ status : "A" })
刪除 status 等于 D 的一個文檔:
db.inventory.deleteOne( { status: "D" } )


查詢
[語法]
MongoDB 查詢數據的語法格式如下:
db.collection.find(query, projection)

query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。
如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法,語法格式如下:
>db.col.find().pretty()

MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規的 SQL 數據,通過下表可以更好的理解 MongoDB 的條件語句查詢:

操作 格式 范例 RDBMS中的類似語句
等于 (=) {<key>:<value>} db.col.find({"by":"菜鳥教程"}).pretty() where by = '菜鳥教程'
小于 (<) {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 (<=) {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 (>) {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 (>=) {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于(!=) {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

MongoDB AND 條件
>db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 條件
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
[>db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()]
AND 和 OR 聯合使用
以下實例演示了 AND 和 OR 聯合使用,類似常規 SQL 語句為:
where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()

模糊查詢
查詢 title 包含"教"字的文檔:
db.col.find({title:/教/})
查詢 title 字段以"教"字開頭的文檔:
db.col.find({title:/^教/})
查詢 titl e字段以"教"字結尾的文檔:
db.col.find({title:/教$/})

Limit與Skip方法
db.COLLECTION_NAME.find().limit(NUMBER)
Skip() 方法 skip()方法默認參數為 0 。
我們除了可以使用limit()方法來讀取指定數量的數據外,還可以使用skip()方法來跳過指定數量的數據,skip方法同樣接受一個數字參數作為跳過的記錄條數。
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
以下實例只會顯示第二條文檔數據
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
排序 sort() 方法
在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
skip(), limilt(), sort()三個放在一起執行的時候,執行的順序是先 sort(), 然后是 skip(),最后是顯示的 limit()。


操作符
如果想獲取 "col" 集合中 title 為 String 的數據,你可以使用以下命令:
db.col.find({"title" : {$type : 2}})

db.col.find({"title" : {$type : 'string'}})

類型 數字 備注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已廢棄。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

MongoDB 索引
createIndex() 方法
語法
>db.collection.createIndex(keys, options)
語法中 Key 值為你要創建的索引字段,1 為指定按升序創建索引,如果你想按降序來創建索引指定為 -1 即可。
例如:db.col.createIndex({"title":1})
createIndex() 方法中你也可以設置使用多個字段創建索引(關系型數據庫中稱作復合索引)。
>db.col.createIndex({"title":1,"description":-1})
在后臺創建索引:
db.values.createIndex({open: 1, close: 1}, {background: true})

1、查看集合索引
db.col.getIndexes()
2、查看集合索引大小
db.col.totalIndexSize()
3、刪除集合所有索引
db.col.dropIndexes()
4、刪除集合指定索引
db.col.dropIndex("索引名稱")

利用 TTL 集合對存儲的數據進行失效時間設置:經過指定的時間段后或在指定的時間點過期,MongoDB 獨立線程去清除數據。類似于設置定時自動刪除任務,可以清除歷史記錄或日志等前提條件,設置 Index 的關鍵字段為日期類型 new Date()。

例如數據記錄中 createDate 為日期類型時:
設置時間180秒后自動清除。
設置在創建記錄后,180 秒左右刪除。
db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})

2、由記錄中設定日期點清除。
設置 A 記錄在 2019 年 1 月 22 日晚上 11 點左右刪除,A 記錄中需添加 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 IndexexpireAfterSeconds 設值為 0。
db.col.createIndex({"ClearUpDate": 1},{expireAfterSeconds: 0})

其他注意事項:

  • 索引關鍵字段必須是 Date 類型。
  • 非立即執行:掃描 Document 過期數據并刪除是獨立線程執行,默認 60s 掃描一次,刪除也不一定是立即刪除成功。
  • 單字段索引,混合索引不支持。

createIndex() 接收可選參數,可選參數列表如下:

Parameter Type Description
background Boolean 建索引過程會阻塞其它數據庫操作,background可指定以后臺方式創建索引,即增加 "background" 可選參數。 "background" 默認值為false。
unique Boolean 建立的索引是否唯一。指定為true創建唯一索引。默認值為false.
name string 索引的名稱。如果未指定,MongoDB的通過連接索引的字段名和排序順序生成一個索引名稱。
dropDups Boolean 3.0+版本已廢棄。在建立唯一索引時是否刪除重復記錄,指定 true 創建唯一索引。默認值為 false.
sparse Boolean 對文檔中不存在的字段數據不啟用索引;這個參數需要特別注意,如果設置為true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值為 false.
expireAfterSeconds integer 指定一個以秒為單位的數值,完成 TTL設定,設定集合的生存時間。
v index version 索引的版本號。默認的索引版本取決于mongod創建索引時運行的版本。
weights document 索引權重值,數值在 1 到 99,999 之間,表示該索引相對于其他索引字段的得分權重。
default_language string 對于文本索引,該參數決定了停用詞及詞干和詞器的規則的列表。 默認為英語
language_override string 對于文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值為 language.

MongoDB 聚合
MongoDB中聚合(aggregate)主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。有點類似sql語句中的 count(*)。(其實就是count(),max(),sum()用法)
aggregate() 方法
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
例如:
數據結構

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},

現在我們通過以上集合計算每個作者所寫的文章數,使用aggregate()計算結果如下:
select by_user, count(*) from mycol group by by_user
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

表達式 描述 實例
$sum 計算總和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 計算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 獲取集合中所有文檔對應值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 獲取集合中所有文檔對應值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 在結果文檔中插入值到一個數組中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 在結果文檔中插入值到一個數組中,但不創建副本。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根據資源文檔的排序獲取第一個文檔數據。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根據資源文檔的排序獲取最后一個文檔數據 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道
管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。管道操作是可以重復的。
表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔

常見管道操作
$project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。
$match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
$group:將集合中的文檔分組,可用于統計結果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。

示例:(其實沒看懂這里到底怎么寫)

 db.col.aggregate([
{
    $group:{
        _id:"$age",count:{$sum:1}
        }
},
{
    $sort:{
        age:-1
    }
}
])

備份恢復
備份
命令: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目錄,這個目錄里面存放該數據庫實例的備份數據。

恢復
mongorestore -h <hostname><:port> -d dbname <path>

--host <:port>, -h <:port>:
MongoDB所在服務器地址,默認為: localhost:27017
--db , -d :
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份后添加修改的數據都會被刪除,慎用哦!
<path>:
mongorestore 最后的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。
你不能同時指定 <path> 和 --dir 選項,--dir也可以設置備份目錄。
--dir:
指定備份的目錄
你不能同時指定 <path> 和 --dir 選項。

mongodb監控
mongostat 命令
mongostat是mongodb自帶的狀態檢測工具,在命令行下使用。它會間隔固定時間獲取mongodb的當前運行狀態,并輸出。如果你發現數據庫突然變慢或者有其他問題的話,你第一手的操作就考慮采用mongostat來查看mongo的狀態。
啟動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 然后輸入mongostat命令,如下所示:
D:\set up\mongodb\bin>mongostat

image.png

mongotop 命令
mongotop也是mongodb下的一個內置工具,mongotop提供了一個方法,用來跟蹤一個MongoDB的實例,查看哪些大量的時間花費在讀取和寫入數據。 mongotop提供每個集合的水平的統計數據。默認情況下,mongotop返回值的每一秒。
啟動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 然后輸入mongotop命令,如下所示:
D:\set up\mongodb\bin>mongotop
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
image.png

報告每個數據庫的鎖的使用中,使用mongotop - 鎖,這將產生以下輸出:
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop --locks
image.png

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