mongoDB初识一二三
官網(wǎng)下載
選擇server => MongoDB Community Server(商業(yè)版) => 選擇64位的下載
安裝一路回車,我這里安裝到了C:\Program Files\MongoDB\Server\4.0\bin
配置環(huán)境變量
運(yùn)行MongoDB服務(wù)端
啟動(dòng)服務(wù)端,啟動(dòng)服務(wù)的命令的文件是:mongod.exe
- 1.打開(kāi)命令行(win+R),輸入mongod
- 2.會(huì)發(fā)現(xiàn)服務(wù)并沒(méi)有啟動(dòng),報(bào)exception(異常)
- 3.可以在c盤(pán)新建data\db文件夾,或者需要新建db文件夾作為數(shù)據(jù)庫(kù)存放路徑,在C:\Program Files\MongoDB下新建一個(gè)db文件夾,win+R,輸入cmd,然后用cd命令進(jìn)入C:\Program Files\MongoDB:\bin目錄下,執(zhí)行如下命令: C:\Program Files\MongoDB\bin>mongod.exe --dbpath C:\Program Files\MongoDB\db
將會(huì)輸出服務(wù)端相關(guān)信息,包括版本,數(shù)據(jù)庫(kù)所在路徑,監(jiān)聽(tīng)端口號(hào),數(shù)據(jù)庫(kù)大小等等、看到這個(gè)說(shuō)明你已經(jīng)成功了,默認(rèn)端口是27017
- 4.服務(wù)端開(kāi)啟后,可以用命令行鏈接服務(wù)端,鏈接文件是mongo.ext,不要關(guān)閉服務(wù)端Dos,重新打開(kāi)一個(gè)dos窗口,輸入mongo,鏈接后,輸入以下指令:
如果有數(shù)據(jù)說(shuō)明安裝成功
mongoDB常用指令
mongo shell 如果以前接觸過(guò)數(shù)據(jù)庫(kù)一定知道每個(gè)數(shù)據(jù)庫(kù)都有自己獨(dú)特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操作命令就是前端最熟悉的JavaScript命令
操作前你需要打開(kāi)Mongo服務(wù)器和鏈接到服務(wù)器-也就是我們的mongod命令和mongo命令
var x='Hello World' print(x) 復(fù)制代碼這里的輸出命令不是console.log,而是print
輸入函數(shù),輸入一半時(shí)會(huì)有3個(gè)點(diǎn)表示沒(méi)輸完的語(yǔ)句可以繼續(xù)輸
MongoDB的存儲(chǔ)結(jié)構(gòu)
以前我們的關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)都是頂層是庫(kù),庫(kù)下面是表,表下面是數(shù)據(jù)。但是MongoDB有所不同,庫(kù)下面是集合,集合下面是文件,可以看下面這張圖進(jìn)行了解一下。
| 文件(document) | 行(row) |
| 集合(collections) | 表(table) |
| 數(shù)據(jù)庫(kù)(databases) | 數(shù)據(jù)庫(kù)(databases) |
- show dbs :顯示已有數(shù)據(jù)庫(kù),如果你剛安裝好,會(huì)默認(rèn)有l(wèi)ocal、admin(config),這是MongoDB的默認(rèn)數(shù)據(jù)庫(kù),我們?cè)谛陆◣?kù)時(shí)是不允許起這些名稱的。
- use admin: 進(jìn)入數(shù)據(jù),也可以理解成為使用數(shù)據(jù)庫(kù)。成功會(huì)顯示:switched to db admin。
- show collections: 顯示數(shù)據(jù)庫(kù)中的集合(關(guān)系型中叫表,我們要逐漸熟悉)。 db:顯示當(dāng)前位置,也就是你當(dāng)前使用的數(shù)據(jù)庫(kù)名稱,這個(gè)命令算是最常用的,因?yàn)槟阍谧魅魏尾僮鞯臅r(shí)候都要先查看一下自己所在的庫(kù),以免造成操作錯(cuò)誤。
- use db(建立數(shù)據(jù)庫(kù)):use不僅可以進(jìn)入一個(gè)數(shù)據(jù)庫(kù),如果你敲入的庫(kù)不存在,它還可以幫你建立一個(gè)庫(kù)。但是在沒(méi)有集合前,它還是默認(rèn)為空。
- db.collection.insertOne() 將單個(gè)文檔插入到集合中
- db.collection.insertMany() 將多個(gè) 文檔插入集合中
- db.集合.insert( ):新建數(shù)據(jù)集合和插入文件(數(shù)據(jù)),當(dāng)集合沒(méi)有時(shí),這時(shí)候就可以新建一個(gè)集合,并向里邊插入數(shù)據(jù)。Demo:db.user.insert({“name”:”xiaoling”})
- db.集合.find( ):查詢所有數(shù)據(jù),這條命令會(huì)列出集合下的所有數(shù)據(jù),可以看到MongoDB是自動(dòng)給我們加入了索引值的。Demo:db.user.find()
- db.集合.findOne( ):查詢第一個(gè)文件數(shù)據(jù),這里需要注意的,所有MongoDB的組合單詞都使用首字母小寫(xiě)的駝峰式寫(xiě)法。
- db.集合.update({查詢},{修改}):修改文件數(shù)據(jù),第一個(gè)是查詢條件,第二個(gè)是要修改成的值。這里注意的是可以多加文件數(shù)據(jù)項(xiàng)的,比如下面的例子。
- db.集合.remove(條件):刪除文件數(shù)據(jù),注意的是要跟一個(gè)條件。Demo:db.user.remove({“name”:”xiaoling”})
- db.集合.deleteMany() 刪除所有文檔
- db.集合.drop( ):刪除整個(gè)集合,這個(gè)在實(shí)際工作中一定要謹(jǐn)慎使用,如果是程序,一定要二次確認(rèn)。
- db.dropDatabase( ):刪除整個(gè)數(shù)據(jù)庫(kù),在刪除庫(kù)時(shí),一定要先進(jìn)入數(shù)據(jù)庫(kù),然后再刪除。實(shí)際工作中這個(gè)基本不用,實(shí)際工作可定需要保留數(shù)據(jù)和痕跡的。
- exit 退出命令
在js中寫(xiě)mongodb
eg 新建一個(gè)login.js文件
var userName = 'niuxiaoling'; // 聲明登錄名 var timeStamp = Date.parse(new Date()); //時(shí)間戳 var jsonDatebase = {'loginName':userName,"loginTime":timeStamp } var db = connect('log');//use log db.login.insert(jsonDatebase); // login集合print('log print success'); 復(fù)制代碼執(zhí)行l(wèi)ogin.js 直接DOS中 mongo login.js
在操作數(shù)據(jù)庫(kù)時(shí)要注意: 第一個(gè)是快速存儲(chǔ)能力 第二個(gè)是迅速查詢能力
批量插入數(shù)據(jù)
db.test.insert([{"_id":1},{"_id":2},{"_id":3} ]) 復(fù)制代碼注意一次插入不要超過(guò)48M,向.zip和大圖片什么的盡量用靜態(tài)存儲(chǔ),MongoDB存儲(chǔ)靜態(tài)路徑就好,這也算是一個(gè)規(guī)則。
循環(huán)插入數(shù)據(jù)
var startTime = (new Date()).getTime(); //得到開(kāi)始時(shí)間 var db = connect('log'); //鏈接數(shù)據(jù)庫(kù) //開(kāi)始循環(huán) for(let i=0;i<1000;i++){db.test.insert({num:i}); }var runTime = (new Date()).getTime()-startTime;//計(jì)算時(shí)間差 print ('This run this is:'+runTime+'ms');//打印出來(lái) 507ms 復(fù)制代碼批量插入數(shù)據(jù)
var startTime = (new Date()).getTime(); var db = connect('log');var tempArray = [] //聲明一個(gè)數(shù)組 for(let i=0;i<1000;i++){ //循環(huán)向數(shù)組中放入值tempArray.push({num:i}); } db.test.insert(tempArray) //批量一次插入var runTime = (new Date()).getTime()-startTime; print ('This run this is:'+runTime+'ms'); // 17ms 復(fù)制代碼修改數(shù)據(jù)的錯(cuò)誤點(diǎn) 插入數(shù)據(jù)文件demo02.js
var db = connect('log')var webwork = {name: 'xiaoling',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'} } var webwork1 = {name: 'list',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'} } var webwork2 = {name: 'wangwu',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'} } var workmoney = [webwork, webwork1, webwork2] db.workspace.insert(workmoney)print('The data was inserted successfully.') 復(fù)制代碼錯(cuò)誤點(diǎn):只update修改項(xiàng)
正確的:demo03.js可以聲明一個(gè)變量,然后把要改變數(shù)據(jù)的全部信息放入變量,最后執(zhí)行修改操作。
var db = connect('log')var webwork2 = {name: 'chenming',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'} }db.workspace.update({name: 'xiaoling' }, webwork2)print('[update] the data was updated successfully') 復(fù)制代碼需要?jiǎng)h除(db.workmate.drop())表中的數(shù)據(jù),因?yàn)镸inJie這個(gè)用戶已經(jīng)不在數(shù)據(jù)庫(kù)中了,然后重新使用load方法載入插入數(shù)據(jù)再進(jìn)行修改。然后執(zhí)行 db.workmate.drop() load('./demo02.js') load('./demo03.js')
update修改器
- 輸入db.workspace.update,可以看到update函數(shù)接收4個(gè)參數(shù),query,fields,upsert,multi,其中第一個(gè)查詢和第二個(gè)修改提交是必填
- $set 用來(lái)修改一個(gè)指定的鍵值(key)
- 修改嵌套內(nèi)容(內(nèi)嵌文檔)
- $unset用于將key值刪除
- $inc對(duì)數(shù)字計(jì)算
- multi: true對(duì)所有的數(shù)據(jù)插入一個(gè)健值,true,全部加,false只加一條
- upsert也有兩個(gè)值:true代表沒(méi)有就添加,false代表沒(méi)有不添加(默認(rèn)值)。
我就是這么一遍遍的測(cè)試的
update:數(shù)組修改器
- $push 追加數(shù)組/內(nèi)嵌文檔值
- $ne 查找是否存在,不存在就執(zhí)行,存在就不執(zhí)行
-
$addToSet 查找是否存在,不存在就push上去
-
$each 批量追加
-
$pop只刪除一次,并不是刪除所有數(shù)組中的值。而且它有兩個(gè)選項(xiàng),一個(gè)是1和-1。
-
1:從數(shù)組末端進(jìn)行刪除
-
-1:從數(shù)組開(kāi)端進(jìn)行刪除
數(shù)組定位修改
有時(shí)候只知道修改數(shù)組的第幾位,但并不知道是什么,這時(shí)候我們可以使用interest.int 的形式。
db.workspace.update({name:'xiaoling'},{$set:{"interest.3":'work'}}) //根據(jù)數(shù)組的定位修改,interest.int 復(fù)制代碼應(yīng)答式操作
非應(yīng)答式操作即:在操作完數(shù)據(jù)庫(kù)后,它給我們?nèi)魏蔚幕貞?yīng)和返回值
應(yīng)答式寫(xiě)入:就會(huì)給我們直接返回結(jié)果(報(bào)表),結(jié)果里邊的包含項(xiàng)會(huì)很多,這樣我們就可以很好的進(jìn)行程序的控制和安全機(jī)制的處理。有點(diǎn)像前端調(diào)用后端接口,無(wú)論作什么,后端都要給我一些狀態(tài)字一樣。
-
db.runCommand() 數(shù)據(jù)庫(kù)運(yùn)行命令的執(zhí)行器,執(zhí)行命令首選就要使用它
-
db.listCommands() 查看所有的Commad命令
-
db.runCommand({ping:1}) 查看是否和數(shù)據(jù)庫(kù)連接成功
-
findAndModify 配置它可以在修改后給我們返回修改的結(jié)果
- 屬性值
- query: 需要查詢的條件/文檔
- sort: 進(jìn)行排序
- new[boolean]:返回更新前的文檔還是更新后的文檔
- fields:需要返回的字段
- upsert:沒(méi)有這個(gè)值是否增加
- remove[boolean]:是否刪除查找到的文檔,true,可以刪除
- update: 查找到修改,跟remove只能有1個(gè)
查找:find的不等修飾符
- db.集合.find(要查找的內(nèi)容,查找的條件)
- 不等修飾符
- 小于($lt):英文全稱less-than
- 小于等于($lte):英文全稱less-than-equal
- 大于($gt):英文全稱greater-than
- 大于等于($gte):英文全稱greater-than-equal
- 不等于($ne):英文全稱not-equal
查找:find的多條件查詢
- nin
- $or 或者修飾符
- $and 需要同時(shí)滿足
- not修飾符不能應(yīng)用在條件語(yǔ)句中,只能在外邊進(jìn)行查詢使用。
查找:find的數(shù)組查詢
- db.workspace.find({interest:[]}) // 中括號(hào)代碼完全匹配
- $all-數(shù)組多項(xiàng)查詢
- in主要滿足數(shù)組中的一項(xiàng)就可以被查出來(lái)
- $size-數(shù)組個(gè)數(shù)查詢
- $slice-顯示選項(xiàng)
查找:find的參數(shù)使用方法
- query:這個(gè)就是查詢條件,MongoDB默認(rèn)的第一個(gè)參數(shù)。
- fields:(返回內(nèi)容)查詢出來(lái)后顯示的結(jié)果樣式,可以用true和false控制是否顯示。
- limit:返回的數(shù)量,后邊跟數(shù)字,控制每次查詢返回的結(jié)果數(shù)量。
- skip:跳過(guò)多少個(gè)顯示,和limit結(jié)合可以實(shí)現(xiàn)分頁(yè)。
- sort:排序方式,從小到大排序使用1,從大到小排序使用-1。
實(shí)現(xiàn)分頁(yè)的demo,將limit和skip結(jié)合起來(lái)
db.workspace.find({},{name:true,age:true,_id:false}).limit(2).skip(0).sort({age:1}); 復(fù)制代碼- where修飾符的使用
find在js中正常顯示
游標(biāo)
- hasNext()
索引
-
db.集合.getIndexes() 查看索引
-
db.集合.ensureIndex({username:1}) 建議索引
-
什么情況不需要使用索引?
- 數(shù)據(jù)不超萬(wàn)條時(shí),不需要使用索引。性能的提升并不明顯,而大大增加了內(nèi)存和硬盤(pán)的消耗。
- 查詢數(shù)據(jù)超過(guò)表數(shù)據(jù)量30%時(shí),不要使用索引字段查詢。實(shí)際證明會(huì)比不使用索引更慢,因?yàn)樗罅繖z索了索引表和我們?cè)怼?/li>
- 數(shù)字索引,要比字符串索引快的多,在百萬(wàn)級(jí)甚至千萬(wàn)級(jí)數(shù)據(jù)量面前,使用數(shù)字索引是個(gè)明確的選擇。
- 把你經(jīng)常查詢的數(shù)據(jù)做成一個(gè)內(nèi)嵌數(shù)據(jù)(對(duì)象型的數(shù)據(jù)),然后集體進(jìn)行索引。
復(fù)合索引
加入現(xiàn)在再建立一個(gè)索引,查詢的時(shí)候就是復(fù)合索引查詢, MongoDB的復(fù)合查詢是按照我們的索引順序進(jìn)行查詢
自定義索引順序hint
var rs = db.test.find({username: 'p3octakdxkn1u', randNum0: 169770}).hint({randNum0: 1, username: 2}) // MongoDB的復(fù)合查詢是按照我們的索引順序進(jìn)行查詢,用我們自己指定的索引優(yōu)先查詢,這個(gè)方法就是hint() 復(fù)制代碼刪除索引
db.集合.dropIndex('username_1') // 索引的唯一Id,索引的唯一id不是我們的字段名稱而是索引查詢表中的name
全文索引
- db.info.ensureIndex({contextInfo:'text'}) // text代表全文索引
- 全文索引查找
- $text:表示要在全文索引中查東西。
- $search:后邊跟查找的內(nèi)容。
- 查找多個(gè)詞
- 如果我們這時(shí)候希望不查找出來(lái)有drink這個(gè)單詞的記錄,我們可以使用“-”減號(hào)來(lái)取消。
- 全文搜索中是支持轉(zhuǎn)義符的,比如我們想搜索的是兩個(gè)詞(love PlayGame和drink),這時(shí)候需要使用\斜杠來(lái)轉(zhuǎn)意
內(nèi)置角色:
- 數(shù)據(jù)庫(kù)用戶角色:read、readWrite;
- 數(shù)據(jù)庫(kù)管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManage;
- 備份恢復(fù)角色:backup、restore;
- 所有數(shù)據(jù)庫(kù)角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級(jí)用戶角色:root
- 內(nèi)部角色:__system
圖形管理界面
只是操作客戶端的界面,服務(wù)端還是要開(kāi)啟的
下載地址 下載好的界面感謝技術(shù)胖的分享視頻:技術(shù)胖的博客
轉(zhuǎn)載于:https://juejin.im/post/5ce7b947f265da1bb13f0c9d
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的mongoDB初识一二三的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JVM — 类加载机制
- 下一篇: 最全面的C/C++编码规范总结