mongoDB初識一二三

官網下載

選擇server => MongoDB Community Server(商業版) => 選擇64位的下載javascript

安裝一路回車,我這裏安裝到了C:\Program Files\MongoDB\Server\4.0\binhtml

配置環境變量前端

運行MongoDB服務端

啓動服務端,啓動服務的命令的文件是:mongod.exejava

  • 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

將會輸出服務端相關信息,包括版本,數據庫所在路徑,監聽端口號,數據庫大小等等、看到這個說明你已經成功了,默認端口是27017node

  • 4.服務端開啓後,能夠用命令行連接服務端,連接文件是mongo.ext,不要關閉服務端Dos,從新打開一個dos窗口,輸入mongo,連接後,輸入如下指令:
查看存在數據庫命令:mongo show dbs
查看數據庫版本命令:mongo db.version()
複製代碼

若是有數聽說明安裝成功mysql

mongoDB經常使用指令

mongo shell 若是之前接觸過數據庫必定知道每一個數據庫都有本身獨特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操做命令就是前端最熟悉的JavaScript命令web

操做前你須要打開Mongo服務器和連接到服務器-也就是咱們的mongod命令和mongo命令sql

var x='Hello World'
print(x)
複製代碼

這裏的輸出命令不是console.log,而是printmongodb

輸入函數,輸入一半時會有3個點表示沒輸完的語句能夠繼續輸shell

MongoDB的存儲結構

之前咱們的關係型數據庫的數據結構都是頂層是庫,庫下面是表,表下面是數據。可是MongoDB有所不一樣,庫下面是集合,集合下面是文件,能夠看下面這張圖進行了解一下。

mongoddb(非關係型數據庫) mysql(關係型數據庫)
文件(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)
dbd .workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})
複製代碼
  • 修改嵌套內容(內嵌文檔)
db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
複製代碼
  • $unset用於將key值刪除
db.workmate.update({"name":"MinJie"},{$unset:{"age":''}})
複製代碼
  • $inc對數字計算
db.workspace.update({name: 'list'}, {$inc: {age: -2}}) 
複製代碼
  • multi: true對全部的數據插入一個健值,true,所有加,false只加一條
db.workspace.update({}, {$set: {birth: ''}}, {multi: true})
複製代碼
  • upsert也有兩個值:true表明沒有就添加,false表明沒有不添加(默認值)。
db.workspace.update({name: 'xiaoling'}, {age: 15, sex: 1}, {upsert: true})
複製代碼

我就是這麼一遍遍的測試的

update:數組修改器

  • $push 追加數組/內嵌文檔值
// db.workspace.update({name: 'xiaoling'}, {$push: {interest: 'draw'}})  // 爲數組追加一條
複製代碼
  • $ne 查找是否存在,不存在就執行,存在就不執行
db.workspace.update({name:'xiaoling',interest:{$ne:'computer'}},{$push:{interest:'computer'}}) // $ne 判斷是否存在,存在不執行,不存在執行
複製代碼
  • $addToSet 查找是否存在,不存在就push上去

  • $each 批量追加

var interestList = ['sleep','music','computer','code'];
db.workspace.update({name:'xiaoling'},{$addToSet:{interest:{$each:interestList}}}) 
複製代碼
  • $pop只刪除一次,並非刪除全部數組中的值。並且它有兩個選項,一個是1和-1。

  • 1:從數組末端進行刪除

  • -1:從數組開端進行刪除

db.workspace.update({name:'xiaoling'},{$pop:{interest:-1}}) // $pop 刪除數組值,-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個
var myModify = {
  findAndModify: 'workspace',
  query: {age: 15},
  update: {$set: {name: 'xiaoling'}},
  new: true,
  upsert: true
}
var resultMessage = db.runCommand(myModify)
printjson(resultMessage)  // 輸出json
複製代碼

查找:find的不等修飾符

  • db.集合.find(要查找的內容,查找的條件)
db.workspace.find(
  {'skill.skillOne': 'html'},
  {name: true, 'skill.skillTwo': 1, _id: 0}
)   // 0 表明false,1表明true
複製代碼
  • 不等修飾符
  • 小於($lt):英文全稱less-than
  • 小於等於($lte):英文全稱less-than-equal
  • 大於($gt):英文全稱greater-than
  • 大於等於($gte):英文全稱greater-than-equal
  • 不等於($ne):英文全稱not-equal
db.workspace.find(
  {age: {$lte: 30, $gte: 25}},
  {name: true, age: true, 'skill.skillOne': true, _id: false}
)
複製代碼

查找:find的多條件查詢

  • in 多值查詢條件 ,一個key,一健多值,相對的是nin
db.workspace.find({age: {$in: [25, 30]}}, {_id: 0})
複製代碼
  • $or 或者修飾符
db.workspace.find(
  {$or: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
  {_id: 0}
)
複製代碼
  • $and 須要同時知足
db.workspace.find(
  {$and: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
  {_id: 0}
)
複製代碼
  • not 它用來查詢除條件以外的值,須要注意的是not修飾符不能應用在條件語句中,只能在外邊進行查詢使用。
db.workspace.find({
    age:{
        $not:{
            $lte:30,
            $gte:20
        }
    }
},
{name:1,"skill.skillOne":1,age:1,_id:0}
)
複製代碼

查找:find的數組查詢

  • db.workspace.find({interest:[]}) // 中括號代碼徹底匹配
  • $all-數組多項查詢
db.workspace.find({interest:{$all:['看電影','看書']}}) 
複製代碼
  • in-in主要知足數組中的一項就能夠被查出來
db.workspace.find({interest:{$in:['看電影','旅遊']}})
複製代碼
  • $size-數組個數查詢
db.workspace.find({interest:{$size:5}})
複製代碼
  • $slice-顯示選項
db.workspace.find({},{name:1,interest:{$slice:2},_id:0}) // 查找全部的數據,只展現興趣的前2條信息
複製代碼

查找: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修飾符 這裏的this指向的是workmate(查詢集合)自己。這樣咱們就能夠在程序中隨意調用。雖然強大和靈活,可是這種查詢對於數據庫的壓力和安全性都會變重,因此在工做中儘可能減小where修飾符的使用
db.workspace.find({$where:'this.age>30'},{name:true,age:true,_id:false})  // where查詢,this指的是workspace集合
複製代碼

find在js中正常顯示

遊標

  • hasNext()
var db = connect('log') // 連接集合log
var result = db.workspace.find({interest: {$size: 5}}) //查詢 聲明result,把查詢結果賦值給result
//利用遊標的hasNext()進行循環輸出結果。
// while (result.hasNext()) {
//  printjson(result.next())
// }
或者利用foreach
result.forEach(function(result){
    printjson(result)
})
複製代碼

索引

  • 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:後邊跟查找的內容。
var db = connect('log')
// db.info.insert({
//   contextInfo:
//     'I am a programmer, I love life, love family. Every day after work, I write a diary.'
// })
// db.info.insert({
//   contextInfo:
//     'I am a programmer, I love PlayGame, love drink. Every day after work, I playGame and drink.'
// })

var rs = db.info.find({$text: {$search: 'PlayGame'}})
rs.forEach(rs => printjson(rs))

複製代碼
  • 查找多個詞
// var rs = db.info.find({$text: {$search: 'programmer family diary drink'}}) // 查找多個詞
複製代碼
  • 若是咱們這時候但願不查找出來有drink這個單詞的記錄,咱們可使用「-」減號來取消。
var rs = db.info.find({$text: {$search: 'programmer family diary -drink'}})  // 不但願找到的
複製代碼
  • 全文搜索中是支持轉義符的,好比咱們想搜索的是兩個詞(love PlayGame和drink),這時候須要使用\斜槓來轉意
var rs = db.info.find({$text: {$search: '"love PlayGame" drink'}}) // 轉義
複製代碼

內置角色:

  • 數據庫用戶角色:read、readWrite;
  • 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
  • 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManage;
  • 備份恢復角色:backup、restore;
  • 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超級用戶角色:root
  • 內部角色:__system

圖形管理界面

只是操做客戶端的界面,服務端仍是要開啓的

下載地址

下載好的界面

感謝技術胖的分享視頻:技術胖的博客

相關文章
相關標籤/搜索