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