一、安裝
使用 curl 命令來下載安裝:
# 進入 /usr/local
cd /usr/local
# 下載
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.4.2.tgz
# 解壓
sudo tar -zxvf mongodb-osx-x86_64-3.4.2.tgz
# 重命名為 mongodb 目錄
sudo mv mongodb-osx-x86_64-3.4.2 mongodb
安裝完成后监憎,把 MongoDB 的二進制命令文件目錄(安裝目錄/bin)添加到 PATH 路徑中:
export PATH=/usr/local/mongodb/bin:$PATH
二若皱、運行 MongoDB
1运吓、首先創(chuàng)建一個數(shù)據(jù)庫存儲目錄 /data/db:
sudo mkdir -p /data/db
2、啟動 mongodb兄春,默認數(shù)據(jù)庫目錄即為 /data/db:
sudo mongod
# 如果沒有創(chuàng)建全局路徑 PATH澎剥,需要進入以下目錄
cd /usr/local/mongodb/bin
sudo ./mongod
3 、再打開一個終端進入執(zhí)行以下命令:
$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
……
> 1 + 1
2
>
//控制臺輸出赶舆,不再使用console.log('巴拉巴拉'),而是使用print('巴拉巴拉')
三哑姚、常用命令
1、 創(chuàng)建數(shù)據(jù)庫芜茵、切換數(shù)據(jù)庫 use DATABASE_NAME
如果數(shù)據(jù)庫不存在叙量,則創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫九串。以下實例我們創(chuàng)建了數(shù)據(jù)庫 runoob:
> use runoob
switched to db runoob
> db
runoob
>
2绞佩、查看所有數(shù)據(jù)庫 show dbs
> show dbs
local 0.078GB
test 0.078GB
>
3、查看當前在那個數(shù)據(jù)庫猪钮,避免進錯庫 db
> db
runoob
4品山、查看數(shù)據(jù)庫版本命令:db.version()
> db.version()
3.4.2
5、創(chuàng)建集合 db.createCollection(name, options)
> db.createCollection("mycol", { capped : true,
autoIndexId : true,
size :6142800, max : 10000 } )
7烤低、查看已有集合 show collections
> show collections
mycol
在 MongoDB 中肘交,也可以不集合。插入一些文檔時扑馁,MongoDB 會自動創(chuàng)建集合
> db.mycol2.insert({"name" : "qianxm"})
> show collections
mycol
mycol2
8涯呻、刪除
db.集合.remove(條件) #刪除文件數(shù)據(jù)
db.集合.drop() #刪除整個集合
db.dropDatabase() #刪除整個數(shù)據(jù)庫
//demo
> db.mycol2.drop() #刪除
true
> show collections #查看集合列表發(fā)現(xiàn)已經(jīng)刪除
mycol
9、插入文檔 db.COLLECTION_NAME.insert(document)
>db.col.insert({title: 'MongoDB 呀',
description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
WriteResult({ "nInserted" : 1 })
也可以將數(shù)據(jù)定義為一個變量
> document=({title: 'MongoDB ',
description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
> db.col.insert(document)
# 插入單條數(shù)據(jù)
# 插入單條數(shù)據(jù)
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("571a218011a82a1d94c02333")
}
# 插入多條數(shù)據(jù)
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]
}
10檐蚜、查看已插入文檔 db.col.find()
> db.col.find()
{ "_id" : ObjectId("5ab4da883abaceb3faebc0f5"), "title" : "MongoDB 呀", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>db.col.findOne() //查詢第一條記錄
>
11魄懂、更新文檔 db.集合.update({查詢},{修改})
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
//query : update的查詢條件,類似sql update查詢內(nèi)where后面的闯第。
//update : update的對象和一些更新的操作符(如$,$inc...)等市栗,也可以理解為sql update查詢內(nèi)set后面的
//upsert : 可選,這個參數(shù)的意思是咳短,如果不存在update的記錄填帽,是否插入objNew,true為插入,默認是false咙好,不插入篡腌。
//multi : 可選,mongodb 默認是false,只更新找到的第一條記錄勾效,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新嘹悼。
//writeConcern :可選叛甫,拋出異常的級別。
//修改多條相同的文檔杨伙,需要設(shè)置 multi 參數(shù)為 true其监。
db.col.update({'title':'MongoDB '},{$set:{'title':'MongoDB'}},{multi:true})
//只更新第一條記錄:
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 );
//更新單個文檔
db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
//更新多個文檔
db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
12、刪除文檔 db.collection.remove()
db.collection.remove(
<query>,
<justOne>
)
//query :(可選)刪除的文檔的條件限匣。
//justOne : (可選)如果設(shè)為 true 或 1抖苦,則只刪除一個文檔。
//writeConcern :(可選)拋出異常的級別米死。
//移除 title 為 'MongoDB' 的所有文檔
db.col.remove({'title':'MongoDB '})
//移除 title 為 'MongoDB' 的第一條記錄
db.col.remove({'title':'MongoDB '},1)
//新方法
//刪除 status 等于 A 的全部文檔:
db.inventory.deleteMany({ status : "A" })
//刪除 status 等于 D 的一個文檔:
db.inventory.deleteOne( { status: "D" } )
13锌历、查詢文檔
db.collection.find(query, projection)
//query :可選,使用查詢操作符指定查詢條件
//projection :可選峦筒,使用投影操作符指定返回的鍵究西。查詢時返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認省略)勘天。
//要以易讀的方式來讀取數(shù)據(jù)怔揩,可以使用 pretty() 方法
db.col.find().pretty()
查詢條件 where
MongoDB 與 RDBMS Where 語句比較
查詢條件 AND
//MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開脯丝,即常規(guī) SQL 的 AND 條件
db.col.find({key1:value1, key2:value2}).pretty()
查詢條件 OR
//MongoDB OR 條件語句使用了關(guān)鍵字 $or
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 聯(lián)合使用
//以下演示了 AND 和 OR 聯(lián)合使用商膊,類似常規(guī) SQL 語句為: 'where likes>50 AND (by = '栗子' OR title = 'MongoDB ')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "栗子"},{"title": "MongoDB "}]}).pretty()
projection 參數(shù)的使用方法
//若不指定 projection,則默認返回所有鍵宠进,指定 projection 格式如下晕拆,有兩種模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
//兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應(yīng)返回)
db.collection.find(query, {title: 1, by: 0}) // 錯誤
//只能全1或全0材蹬,除了在inclusion模式時可以指定_id為0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確
14实幕、條件操作符 大于 小于
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =
15、 $type 操作符
MongoDB 中可以使用的類型如下表所示:
image.png
//如想獲取 "col" 集合中 title 為 String 的數(shù)據(jù)堤器,可以使用以下命令:
db.col.find({"title" : {$type : 2}})
16昆庇、Limit與Skip方法
如果需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法闸溃,limit()方法接受一個數(shù)字參數(shù)整吆,該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
limit()方法基本語法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER)
//比如顯示查詢文檔中的兩條記錄
> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
//如果沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)辉川。
除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外表蝙,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)乓旗。
skip() 方法腳本語法格式如下:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
//以下實例只會顯示第二條文檔數(shù)據(jù)
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>
注:skip()方法默認參數(shù)為 0
17府蛇、排序 sort()方法
使用sort()方法對數(shù)據(jù)進行排序,sort()方法可以通過參數(shù)指定排序的字段屿愚,并使用 1 和 -1 來指定排序的方式汇跨,其中 1 為升序排列务荆,而-1是用于降序排列。
sort()方法基本語法如下:
db.COLLECTION_NAME.find().sort({KEY:1})
//col 集合中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務(wù)器端腳本語言扰法。", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言蛹含。", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
// col 集合中的數(shù)據(jù)按字段 likes 的降序排列:
>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>
skip(), limilt(), sort()三個放在一起執(zhí)行的時候,執(zhí)行的順序是先 sort(), 然后是 skip()塞颁,最后是顯示的 limit()。
18吸耿、 索引 ensureIndex() 方法
索引通常能夠極大的提高查詢的效率祠锣,如果沒有索引,MongoDB在讀取數(shù)據(jù)時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄咽安。
這種掃描全集合的查詢效率是非常低的伴网,特別在處理大量的數(shù)據(jù)時,查詢可以要花費幾十秒甚至幾分鐘妆棒,這對網(wǎng)站的性能是非常致命的澡腾。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中糕珊,索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)
MongoDB使用 ensureIndex() 方法來創(chuàng)建索引动分。基本語法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1})
//語法中 Key 值為要創(chuàng)建的索引字段红选,1為指定按升序創(chuàng)建索引澜公,如果想按降序來創(chuàng)建索引指定為-1即可。
//示例
db.col.ensureIndex({"title":1})
ensureIndex() 方法中也可以設(shè)置使用多個字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫中稱作復合索引)喇肋。
db.col.ensureIndex({"title":1,"description":-1})
//后臺創(chuàng)建索引:通過在創(chuàng)建索引時加background:true 的選項坟乾,讓創(chuàng)建工作在后臺執(zhí)行
db.col.ensureIndex({open: 1, close: 1}, {background: true})
ensureIndex() 可選參數(shù)列表
19、聚合 aggregate() 方法
aggregate() 方法的基本語法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
//如
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "runoob.com",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
//以上實例類似sql語句: select by_user, count(*) from mycol group by by_user
//通過字段by_user字段對數(shù)據(jù)進行分組蝶防,并計算by_user字段相同值的總和甚侣。
聚合的表達式
管道的概念
管道在Unix和Linux中一般用于將當前命令的輸出結(jié)果作為下一個命令的參數(shù)。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理间学。管道操作是可以重復的殷费。
表達式:處理輸入文檔并輸出。表達式是無狀態(tài)的菱鸥,只能用于計算當前聚合管道的文檔宗兼,不能處理其它的文檔。
聚合框架中常用的幾個管道操作:
match:用于過濾數(shù)據(jù)茶行,只輸出符合條件的文檔。
limit:用來限制MongoDB聚合管道返回的文檔數(shù)畔师。
unwind:將文檔中的某一個數(shù)組類型字段拆分成多條看锉,每條包含數(shù)組中的一個值。
sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔轮纫。
管道操作符實例
1腔寡、$project實例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
這樣的話結(jié)果中就只還有_id,tilte和author三個字段了,默認情況下_id字段是被包含的掌唾,如果要想不包含_id話可以這樣:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match實例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于獲取分數(shù)大于70小于或等于90記錄放前,然后將符合條件的記錄送到下一階段$group管道操作符進行處理。
3.$skip實例
db.article.aggregate(
{ $skip : 5 });
經(jīng)過$skip管道操作符處理后糯彬,前五個文檔被"過濾"掉凭语。
20、MongoDB 復制(副本集)
MongoDB復制是將數(shù)據(jù)同步在多個服務(wù)器的過程情连。
復制提供了數(shù)據(jù)的冗余備份叽粹,并在多個服務(wù)器上存儲數(shù)據(jù)副本,提高了數(shù)據(jù)的可用性却舀, 并可以保證數(shù)據(jù)的安全性虫几。
復制還允許從硬件故障和服務(wù)中斷中恢復數(shù)據(jù)。
MongoDB復制原理
mongodb的復制至少需要兩個節(jié)點挽拔。其中一個是主節(jié)點辆脸,負責處理客戶端請求,其余的都是從節(jié)點螃诅,負責復制主節(jié)點上的數(shù)據(jù)啡氢。
mongodb各個節(jié)點常見的搭配方式為:一主一從、一主多從术裸。
主節(jié)點記錄在其上的所有操作oplog倘是,從節(jié)點定期輪詢主節(jié)點獲取這些操作,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作袭艺,從而保證從節(jié)點的數(shù)據(jù)與主節(jié)點一致搀崭。
MongoDB復制結(jié)構(gòu)圖如下所示:
MongoDB復制結(jié)構(gòu)圖
客戶端從主節(jié)點讀取數(shù)據(jù),在客戶端寫入數(shù)據(jù)到主節(jié)點時猾编, 主節(jié)點與從節(jié)點進行數(shù)據(jù)交互保障數(shù)據(jù)的一致性瘤睹。
副本集特征:
N 個節(jié)點的集群
任何節(jié)點可作為主節(jié)點
所有寫入操作都在主節(jié)點上
自動故障轉(zhuǎn)移
自動恢復
四升敲、js操作mongoDB
1、新建 mongoShell/goTask.js
var userName = "qianxm"; //聲明一個登錄名
var timeStamp = Date.parse(new Date()); //聲明登錄時的時間戳
var jsonDdatabase = {
"loginUser": userName,
"loginTime": timeStamp
}; //組成JSON字符串
var db = connect('log'); //鏈接數(shù)據(jù)庫
db.login.insert(jsonDdatabase); //插入數(shù)據(jù)
print('[demo]log print success'); //沒有錯誤顯示成功
然后在 mongoShell目錄下執(zhí)行
mongo goTask.js
//localhost:mongoShell qianxuemin$ mongo goTask.js
五轰传、可視化工具 Robo 3T
登錄命令 db.auth('qxm','123456')