MongoDB旨在為web應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲方案
MongoDB將數(shù)據(jù)存儲為一個文檔缤剧,數(shù)據(jù)結(jié)構(gòu)由鍵值對(key=>value)組成笼痹,類似json對象韭赘,字段值可以包含其他文檔扁掸、數(shù)組乓诽、文檔數(shù)組
安裝mongodb
# 進(jìn)入?
/usr/localcd/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.2mongodb
安裝完成后,我們可以把 MongoDB 的二進(jìn)制命令文件目錄(安裝目錄/bin)添加到 PATH 路徑中:
exportPATH=/usr/local/mongodb/bin:$PATH
運行配置 MongoDB
# 首先創(chuàng)建一個數(shù)據(jù)庫存儲目錄 /data/db:
sudo mkdir-p/data/db
# 啟動 mongodb晨横,默認(rèn)數(shù)據(jù)庫目錄即為 /data/db:
sudo mongod
#創(chuàng)建文件洋腮,進(jìn)入mongodb目錄
cd /usr/local/mongodb
mkdir data
mkdir logs
兩個文件夾,分別是存儲數(shù)據(jù)庫數(shù)據(jù)和日志文件的
# 然后
sudo vim mongodb.conf
其中conf文件內(nèi)容為:
port=27017
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/logs/mongodb.log
logappend=true
第一個是配置的是mongodb的啟動端口颓遏,然后dbpath是指數(shù)據(jù)的存儲路徑徐矩,logpath是指日志存儲路徑,logappend是指日志是否以追加方式添加結(jié)束編輯按 esc
然后 :wq ? ?保存退出
# 調(diào)用mongod命令叁幢,-f 是以配置文件形式啟動滤灯,后面指定的是配置文件所在的位置
sudo /usr/local/mongodb/bin/mongod? -f /usr/local/mongodb/mongdb.conf
# 輸入命令 ,telnet ip地址 端口號曼玩,測試能不能連接某個ip地址的端口鳞骤,如果能連接,證明這個端口已經(jīng)開了黍判,也就是你的應(yīng)用程序已經(jīng)運行了
telnet 127.0.0.1 27017
**還有個方式豫尽,輸入? ps -ef|grep mongodb
啟動MongoDB
在 MongoDB 安裝目錄的 bin 目錄下執(zhí)行mongod即可。
MongoDB可視化工具的使用
# 下載
# 打開
#設(shè)置
文檔
文檔是一個鍵值(key-value)對(即BSON)顷帖。MongoDB 的文檔不需要設(shè)置相同的字段美旧,并且相同的字段不需要相同的數(shù)據(jù)類型,
**需要注意的是:
-文檔中的鍵/值對是有序的贬墩。
-文檔中的值不僅可以是在雙引號里面的字符串榴嗅,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個嵌入的文檔)。
-MongoDB區(qū)分類型和大小寫陶舞。
-MongoDB的文檔不能有重復(fù)的鍵嗽测。
-文檔的鍵是字符串。除了少數(shù)例外情況肿孵,鍵可以使用任意UTF-8字符唠粥。
**文檔鍵命名規(guī)范:
-鍵不能含有\(zhòng)0 (空字符)疏魏。這個字符用來表示鍵的結(jié)尾。
-.和$有特別的意義晤愧,只有在特定環(huán)境下才能使用大莫。
-以下劃線"_"開頭的鍵是保留的(不是嚴(yán)格要求的)。
什么是集合
就是數(shù)據(jù)庫表
沒有固定結(jié)構(gòu)
對集合可以插入不同格式和類型的數(shù)據(jù)养涮,但通常情況下插入集合的數(shù)據(jù)都會有一定的關(guān)聯(lián)性葵硕。
當(dāng)?shù)谝粋€文檔插入時,集合就會被創(chuàng)建贯吓。
capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及隊列過期的特性(過期按照插入的順序). 有點和 "RRD" 概念類似蜀变。
Capped collections是高性能自動的維護(hù)對象的插入順序悄谐。它非常適合類似記錄日志的功能 和標(biāo)準(zhǔn)的collection不同,你必須要顯式的創(chuàng)建一個capped collection库北, 指定一個collection的大小爬舰,單位是字節(jié)。collection的數(shù)據(jù)存儲空間值提前分配的寒瓦。
要注意的是指定的存儲大小包含了數(shù)據(jù)庫的頭信息情屹。
db.createCollection("mycoll",{capped:true,size:100000})
MongoDB數(shù)據(jù)類型
Mongodb基本命令的使用
數(shù)據(jù)庫
# 啟動數(shù)據(jù)庫
? ./mongo
# 查看所有數(shù)據(jù)庫
? ?show dbs
# 刪除數(shù)據(jù)庫
? ?db.dropDatabase()
# 顯示當(dāng)前數(shù)據(jù)庫對象或集合
? ?show db
# 運行"use"命令,可以連接到一個指定的數(shù)據(jù)庫,如果數(shù)據(jù)庫不存在杂腰,則創(chuàng)建數(shù)據(jù)庫
? ?use local
有一些數(shù)據(jù)庫名是保留的垃你,可以直接訪問這些有特殊作用的數(shù)據(jù)庫。
admin: 從權(quán)限的角度來看喂很,這是"root"數(shù)據(jù)庫惜颇。要是將一個用戶添加到這個數(shù)據(jù)庫,這個用戶自動繼承所有數(shù)據(jù)庫的權(quán)限少辣。一些特定的服務(wù)器端命令也只能從這個數(shù)據(jù)庫運行凌摄,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器。
local:這個數(shù)據(jù)永遠(yuǎn)不會被復(fù)制漓帅,可以用來存儲限于本地單臺服務(wù)器的任意集合
config: 當(dāng)Mongo用于分片設(shè)置時锨亏,config數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的相關(guān)信息忙干。
文檔
# 剛創(chuàng)建的數(shù)據(jù)庫并不在數(shù)據(jù)庫的列表中器予, 要顯示它,我們需要向該數(shù)據(jù)庫插入一些數(shù)據(jù)豪直。
# 插入文檔劣摇,COLLECTION_NAME是集合名,如果該集合不在該數(shù)據(jù)庫中弓乙, MongoDB 會自動創(chuàng)建該集合并插入文檔末融。
? ?db.COLLECTION_NAME.insert(document)? /db.COLLECTION_NAME.save(document)
# 查看文檔
? db.COLLECTION_NAME.find()
# 格式化返回結(jié)果查看文檔
? db.COLLECTION_NAME.find().pretty()
# 只返回一個文檔
? ? findOne()
# 也可以將數(shù)據(jù)直接定義成變量再插入
? ?document=({xx:'xx',yy:'yy'});
? ?db.COLLECTION_NAME.insert(document)
# 查看集合
? ? show tables
# ?刪除集合
? ? db.COLLECTION_NAME.drop()
# 更新文檔
? ? ## update() 方法用于更新已存在的文檔
參數(shù)說明:
query: update的查詢條件钧惧,類似sql update查詢內(nèi)where后面的。
update: update的對象和一些更新的操作符(如$,$inc...)等勾习,也可以理解為sql update查詢內(nèi)set后面的
upsert: 可選浓瞪,這個參數(shù)的意思是,如果不存在update的記錄巧婶,是否插入objNew,true為插入乾颁,默認(rèn)是false,不插入艺栈。
multi: 可選英岭,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新湿右。
writeConcern:可選诅妹,拋出異常的級別。
? ## save() 方法通過傳入的文檔來替換已有文檔
參數(shù)說明:
document: 文檔數(shù)據(jù)毅人。
writeConcern:可選吭狡,拋出異常的級別。
# remove()函數(shù)是用來移除集合中的數(shù)據(jù)
參數(shù)說明:
query:(可選)刪除的文檔的條件丈莺。
justOne: (可選)如果設(shè)為 true 或 1划煮,則只刪除一個文檔。
writeConcern:(可選)拋出異常的級別缔俄。
# 刪除所有數(shù)據(jù)
? db.COLLECTION_NAME.remove({})
MongoDB 與 RDBMS Where 語句比較
MongoDB AND 條件
db.COLLECTION_NAME.find({key1:value1,key2:value2}).pretty()
MongoDB OR 條件
db.COLLECTION_NAME.find({$or:[{key1:value1},{key2:value2}]}).pretty()
AND 和 OR 聯(lián)合使用
類似常規(guī) SQL 語句為:'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
MongoDB條件操作符
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
MongoDB$type操作符
$type操作符是基于BSON類型來檢索集合中匹配的數(shù)據(jù)類型弛秋,并返回結(jié)果。
db.COLLECTION_NAME.find({"條件":{$type:類型數(shù)字}})
MongoDB Limit() 方法
limit()方法接受一個數(shù)字參數(shù)牵现,該參數(shù)指定從MongoDB中讀取的記錄條數(shù)铐懊。
db.COLLECTION_NAME.find(“條件”).limit(記錄條數(shù))
MongoDB Skip() 方法
skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)瞎疼。
db.COLLECTION_NAME.find().skip(NUMBER)
MongoDB sort()方法
sort()方法可以通過參數(shù)指定排序的字段科乎,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列贼急,而-1是用于降序排列茅茂。
db.COLLECTION_NAME.find().sort({KEY:1/-1})
MongoDB 索引
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中太抓,索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)
db.COLLECTION_NAME.ensureIndex({KEY:1})
Key 值為要創(chuàng)建的索引字段空闲,1為指定按升序創(chuàng)建索引,降序為-1,也可以設(shè)置使用多個字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引)
ensureIndex() 接收可選參數(shù)走敌,可選參數(shù)列表如下:
MongoDB 聚合
主要用于處理數(shù)據(jù)(諸如統(tǒng)計平均值,求和等)碴倾,并返回計算后的數(shù)據(jù)結(jié)果。有點類似sql語句中的 count(*)。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
聚合框架中常用的幾個管道操作符:
$project:修改輸入文檔的結(jié)構(gòu)跌榔∫煅悖可以用來重命名、增加或刪除域僧须,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔纲刀。
$match:用于過濾數(shù)據(jù),只輸出符合條件的文檔担平。$match使用MongoDB的標(biāo)準(zhǔn)查詢操作示绊。
$limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
$skip:在聚合管道中跳過指定數(shù)量的文檔暂论,并返回余下的文檔面褐。
$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值空另。
$group:將集合中的文檔分組盆耽,可用于統(tǒng)計結(jié)果。
$sort:將輸入文檔排序后輸出扼菠。
$geoNear:輸出接近某一地理位置的有序文檔。
Node.js 連接 MongoDB
# 安裝驅(qū)動
? npm install mongodb
# 插入數(shù)據(jù)
# 查詢數(shù)據(jù)
# 更新數(shù)據(jù)
# 刪除數(shù)據(jù)