mongodb入門筆記

来源:http://www.cnblogs.com/web10000/archive/2017/06/26/7081724.html
-Advertisement-
Play Games

mongodb作為nosql中排名第一的資料庫,近年來使用的人數越來越多,作為開發人員,非常有必要瞭解下mongodb資料庫。下麵就給大家介紹下mongodb資料庫的基本知識,有不對的地方歡迎指正 ...


mongodb作為nosql中排名第一的資料庫,近年來使用的人數越來越多,作為開發人員,非常有必要瞭解下mongodb資料庫。下麵就給大家介紹下mongodb資料庫的基本知識,有不對的地方歡迎指正,QQ:1416759661。 另外也歡迎大家加QQ群7835003共同討論.

如果感覺這篇文章理解有難度,我們還有相關的視頻教程 http://www.yyjcw.com/list.html  

1  基本概念

1.1   什麼是資料庫

 

資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,資料庫技術得到了更加快速的發展,應用得更加廣泛。主要用它進行管理各種系統的數據,作為科學研究和決策的重要技術手段。

 

1.2     常見的資料庫

 

關係型資料庫:Access  mySql SqlServer oracle  db2等。

 

非關係型資料庫: MongoDB,Redis,HBase,CouchDB,SQLite等。

 

1.3     NoSQL簡介

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是sql”,泛指非關係型的資料庫。

 

隨著互聯網web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以剋服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。NoSQL資料庫的產生就是為瞭解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。

 

1.4     MongoDB簡介

   

MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是非關係型資料庫當中功能最豐富,最像關係型資料庫的。

 

2  準備工作

2.1     MongoDB下載與安裝

MongoDB官網地址:

 

https://www.mongodb.com/

 

MongoDB下載地址:

https://www.mongodb.com/download-center#community

 

MongoDB for Windows 64-bit 適合 64 位的 Windows Server 2008 R2, Windows 7 , 及最新版本的 Window 系統。

 

MongoDB for Windows 32-bit 適合 32 位的 Window 系統及最新的 Windows Vista。 32 位系統上 MongoDB 的資料庫最大為 2GB。

選擇適合自己系統的版本進行下載:

 根據你的系統下載 32 位或 64 位的 .msi 文件,下載後雙擊該文件,按操作提示安裝即可。

 

2.2     mongochef安裝

mongochef可以提高你使用MongoDB的幸福指數,他是MongoDB的可視化界面管理工具。

 

2.3     設置環境變數

 

Win7下設置環境變數:QQ  1416759661

 

第一步:我的電腦上點擊右鍵,選擇屬性

第二步:找到並打開“高級系統配置”。

在接下來的頁面中點擊“高級系統配置”,打開“系統屬性”視窗。

第三步:找到“環境變數”按鈕並點擊。 

第四部:在環境變數視窗中一般有兩個變數,一個是你當前所使用的用戶獨有的環境變數,另一個是所有用戶都可以訪問的系統變數。其實如果在你的電腦上你只使用一個用戶的話,那麼不管你修改的用戶的環境變數還是系統變數,效果都是一樣的。為了以防未來會新建其他用戶,那麼我建議你修改系統變數而不是某個用戶獨有的環境變數。

 

在變數值最後加上分號 ;C:\Program Files\MongoDB\Server\3.2\bin

然後保存。

2.4     創建文件夾

我們之前安裝的是數據管理軟體,通過資料庫管理軟體可以建立很多個資料庫文件,我們打算把新建的資料庫文件放哪裡呢?需要指定一個位置。

 

Mongodb 資料庫管理軟體與資料庫文件的關係就像office軟體與word文檔的關係。

 

1、在d盤建立一個文件夾mongodb,並且建立子目錄db和log.

d:\mongodb\db、d:\mongodb\log, 分別用來存放資料庫文件和資料庫日誌文件.

2、把mongodb文件夾的只讀屬性去掉。

 

2.5     啟動MongoDB將其安裝為windows服務

 

以管理員身份運行cmd.exe進入dos命令界面,執行下列命令

 

mongod  --dbpath "d:\mongodb\db"  --logpath "d:\mongodb\log\MongoDB.log" –logappend  --install --serviceName "MongoDB"

mongod.exe  --remove  --serviceName "MongoDB"

 

當mongod.exe被關閉時,mongo.exe 就無法連接到資料庫了,因此每次想使用mongodb資料庫都要開啟mongod.exe程式,所以比較麻煩,此時我們可以將MongoDB安裝為windows服務

以管理員身份運行cmd,進入bin文件夾,執行下列命令

mongod  --dbpath "d:\mongodb\db" --logpath "d:\mongodb\log\MongoDB.log" --install --serviceName "MongoDB"

 

這裡MongoDB.log就是開始建立的日誌文件,--serviceName "MongoDB" 服務名為MongoDB

 

接著啟動mongodb服務

  > NET START MongoDB

 打開任務管理器,可以看到進程已經啟動。

  測試連接

 > mongo

 

2.6     關閉服務

先 ctrl+c

關閉服務:net stop MongoDB 

3  MongoDB基礎應用

3.1     常用的命令

 > Help           查看幫助

 

顯示資料庫列表 > show dbs      

創建資料庫 > use dbname  

 如果資料庫不存在,則創建資料庫dbname,否則切換到指定資料庫dbname。創建的資料庫並不在資料庫的列表中,要顯示它,我們需要向資料庫dbname插入一些數據

MongoDB 中預設的資料庫為 test,如果你沒有創建新的資料庫,集合將存放在 test 資料庫中。

顯示資料庫中的集合 show collections    

3.2     增加數據

db.web.save({"name":"老李"})    創建了名為web的集合,並新增了一條{"name":"老李"} 的數據

db.web.insert({"name":"ghost", "age":10})    web集合中插入一條新數據,如果沒有web這個集合,mongodb會自動創建

save()和insert()也存在著些許區別:若新增的數據主鍵已經存在,insert()會不做操作並提示錯誤,而save() 則更改原來的內容為新內容。

_id是主鍵,主鍵是每條數據的唯一標識,不能重覆,就像身份證是每個人唯一的編號一樣。

存在數據:{ _id : ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老李"} ,_id是主鍵

insert({ _id : ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老王 " })    會提示錯誤

 save(ObjectId("57e8d34b4764fb71d0a89caa"), " name " : " 老王 " })     會把“老李”改為 老王”,有update的作用。

 

3.3     刪除數據

1、刪除文檔

2、刪除集合

3、刪除資料庫

  • db.users.remove({})    刪除users集合下所有數據
  • db.users.remove({"name": "lecaf"})   刪除users集合下name=”lecaf”的數據
  • db.users.drop()或db.runCommand({"drop","users"})    刪除集合users
  • db.runCommand({"dropDatabase": 1})    刪除當前資料庫,註意此處的1沒加雙引號。
  • db.users.find()    查找users集合中所有數據
  • db.users.findOne()    查找users集合中的第一條數據
  • db.web.update({"name":"a1"}, {"sex":1})    修改name=a1的數據為sex=1,第一個參數是查找條件,第二個參數是修改內容主鍵不能修改,如圖

3.4     查找數據

3.5     修改數據

3.6     MongoDB高級應用

3.6.1  條件查找

學慣用命令的意義在於:我們做系統的時候,後端人員需要給前端開發人員提供數據,如果後端人員用可視化工具,只是他自己眼睛能看到,但是如果要把這些數據提供給前端,他需要用代碼去查資料庫,把查詢的結果返回給前端。

 

為此:老師給大家整理了下以下這些常見的查詢例子,如果你以後忘記了,就翻出來看看。

 

提前做了一個歌手的json數據,我們可以把他導入到資料庫,練習查找命令。

 

 

 

語法1:db.collection.find({ "key" : value })    查找key=value的數據.

例1:查找女歌星。

思路:查找sex=”女”的歌星。

具體命令:

 語法2: db.collection.find({ "key" : { $gt: value } })    key > value

例2:查找年齡大於53的歌星。

 語法3:db.collection.find({ "key" : { $lt: value } })    key < value

例3:查詢年齡小於35歲的歌星。

 語法4:db.collection.find({ "key" : { $gte: value } })    key >= value

例4:查詢成績大於等於95的歌星。

 語法5:db.collection.find({ "key" : { $lte: value } })    key <= value

例5:查詢年齡在小於等於32歲的歌星。

 語法6:db.collection.find({ "key" : { $gt: value1 , $lt: value2 } })   value1 < key <value2

例6:查找年齡在30-40歲之間的歌星。

 

 

語法7:db.collection.find({ "key" : { $ne: value } })    key <> value

例7:查詢外國歌手。

分析:條件為 country不等於”中國”

 語法8:db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })    取模運算,條件相當於key % 10 == 1 即key除以10餘數為1的

例8:查詢成績為5 、15、25、。。。。95的歌星。

 

語法9:db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } })    屬於,條件相當於key等於[ 1, 2, 3 ]中任何一個.

例9:查詢序號(num)為3或者6或者9的歌星。

 

語法10:db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } })    不屬於,條件相當於key的值不屬於[ 1, 2, 3 ]中任何一個。

例10:查詢國籍不為美國和南韓的歌手。

 

語法11:db.collection.find({ "key" : { $size: 1 } })    $size 數量、尺寸,條件相當於key對應的值的數量是1(值必須是數組)

這個有點難理解,通過例子理解容易些:

每個歌星都有代表作,並且代表作是數組。

例11:查詢有3個代表作品的歌手。

 

語法12:db.collection.find({ "key" : { $exists : true|false } })    

$exists 欄位存在,true返回存在欄位key的數據,false返回不存在欄位key的數據

例12-1:查詢包含tel欄位的數據。

之前的數據欄位都是一樣的,此時插入一條數據{"name":"test","tel":"15388889999"}

然後查詢:

 

例12-2 :查詢不包含tel欄位的數據

 

語法13:db.collection.find({ $or : [{a : 1}, {b : 2} ] })  

符合兩個條件中任意一個的數據。$or語法表示或的意思。 (註意:MongoDB 1.5.3後版本可用),符合條件a=1的或者符合條件b=2的數據都會查詢出來。

例13:某個娛樂公司15個人,資料都在資料庫裡面,某個活動必須要劉德華參加,另外需要團隊的全部女歌手配合演出,領導安排你幫忙列印歌手的資料。

  

db.collection.find({ "key.subkey" :value })   內嵌對象中的值匹配,註意:"key.subkey"必須加引號。

例14:插入一條測試數據

db.singer.insert({"name":"test2",score:{"yy":80,"sx":79,"wy":95}})

此數據的score對應的值是一個對象。

例14:查詢語文成績為80的同學。

 

 

 

3.6.2  排序

db.collection.find().sort({ "key1" : -1 ,"key2" : 1 })    這裡的1代表升序,-1代表降序

例1:對所有歌星安年齡排序。

 

例2:對所有歌星先按年齡降序排列,再按num欄位降序排列。

註意:json數據裡面的num是String類型的。

 

3.6.3  索引

 

索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件並選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。

索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構

 

例如:我們查詢李宇春的時候  db.singer.find({"name":"李宇春"})

如果沒有對name 欄位建立索引,資料庫在查詢的時候會掃描所有的數據,如果數據量小的時候,感覺不出來速度慢,當數據越來越多的時候,就會越來越慢。

這個時候如果給name 建立一個索引,查詢速度就會加快。

MongoDB使用 ensureIndex() 方法來創建索引。

 

ensureIndex()方法基本語法格式如下所示:

 

>db.COLLECTION_NAME.ensureIndex({KEY:1})

 

對name 欄位建立一個索引如下:

 

 

 

 

可視化工具裡面可以看到剛創建的索引:

 

 

語法中 Key 值為你要創建的索引欄位,1為指定按升序創建索引,如果你想按降序來創建索引指定為-1即可。

 

實例

>db.col.ensureIndex({"title":1})>

ensureIndex() 方法中你也可以設置使用多個欄位創建索引(關係型資料庫中稱作複合索引)。

 

> db.col.ensureIndex({"title":1,"description":-1})

 

 

3.6.4  其他

db.collection.find().limit(5)    控制返回結果數量,如果參數是0,則當作沒有約束,limit()將不起作用

 

db.collection.find().skip(5)    控制返回結果跳過多少數量,如果參數是0,則當作沒有約束,skip()將不起作用,或者說跳過了0條

db.collection.find().skip(5).limit(5)    可用來做分頁,跳過5條數據再取5條數據

db.collection.find().count(true)    count()返回結果集的條數

db.collection.find().skip(5).limit(5).count(true)    在加入skip()和limit()這兩個操作時,要獲得實際返回的結果數,需要一個參數true,否則返回的是符合查詢條件的結果總數

 

模糊查詢:

 

db.collection.find({"name":/ab/})

 

 

以上是常見的查詢,如果工作中遇到更加複雜的需求,可以通過查文檔來解決。

 

3.7     使用可視化工具

 

4  Mongoose

4.1     Mongoose簡介

Mongoose庫簡而言之就是在node環境中操作MongoDB資料庫的一種便捷的封裝,一種對象模型工具,Mongoose將資料庫中的數據轉換為JavaScript對象以供你在應用中使用。

 

官方文檔:https://www.npmjs.com/package/mongoose

 

前提:安裝nodejs和mongodb

4.2     Mongoose的操作流程

4.2.1  安裝mongoose

npm install mongoose

4.2.2  連接資料庫

使用mongoose連接資料庫的前提條件是:

 

1、mongo資料庫已經運行。

2、已經安裝了mongoose包

 

var mongoose = require("mongoose");

mongoose.Promise = global.Promise;//配置mongoosePromise

// 連接字元串格式為mongodb://主機/資料庫名

mongoose.connect('mongodb://localhost/student');


上面這句的意思是連接到本地的mongodb的student資料庫

 

 

擴展:

 

mongoose.Promise = global.Promise;

// 連接本地mongodb ,本機的ip 127.0.0.1,埠:27017 資料庫:student
mongoose.connect("mongodb://127.0.0.1:27017/student",function(err){
   if(!err){//如果連接成功,則列印出connected to Mongodb
      console.log("connected to Mongodb");
   }else{
      throw err;//如果連接失敗,則拋出異常
   }
});

 

4.2.3  新增數據

先講解一個概念 Schema:

 

它可以理解為資料庫模型骨架,可以看作工廠中模具一樣,好比一個茶杯,喝水是茶杯最終的功能,茶杯本身就像是Model,那麼茶杯的批量生產是需要靠工廠的模具成型的。Schema不僅定義了文檔結構和使用性能,還可以有擴展插件、實例方法、靜態方法、複合索引、文檔生命周期鉤子。

 

存儲數據步驟:定義Schema- (模式)>創建model-(模型)>實例化方法。

 

 

var Schema = mongoose.Schema;
//通過Schema創建一個模式NewsSchema 
var studentSchema  = new Schema({      
name: String,
     age: String
});
 

studentSchema  類型有哪些:

 

 

 
 
 
 
 
//通過模式studentSchema  創建一個模型studentModel 
var studentModel = mongoose.model("students",studentSchema  );
var studentQueryModel= mongoose.model("students");//用於查詢的模型
 
 
//通過模型studentModel 寫入數據
var instance1 = new studentModel (); 
instance1.name="yyjcw";
instance1.age="18";
//通過save方法保存
instance1.save(function(err){
    if (err) {
       console.log('保存失敗'); 
       return;
    }
 });
 

4.2.4  刪除數據

思路:

 

1、刪除數據首先要知道刪除哪一條信息,需要知道信息的id.

2、把對應id的數據查詢出來,執行remove方法

假如我們要刪除id=”57e24521a755e1154039a403”的數據。

 

var id=”57e24521a755e1154039a403”;

studentQueryModel.findById(id,function(err,doc){
   if(!doc){
      return next(new NotFound("Doc not found"))
   }else{
      doc.remove(function(){
         console.log('刪除成功');
      })
   }
});

 

4.2.5  修改數據

修改數據的思路:先把對應id的數據查詢出來,對需要修改的欄位重新賦值,然後執行save方法保存。

假如我們要修改id=”57e24521a755e1154039a403”的數據。

 

var id=”57e24521a755e1154039a403”;

 

studentQueryModel.findById(id,function(err,doc){
   //console.log(doc);
  
doc.name="xiaoyyjcw" ;//把name修改為xiaoyyjcw
   doc.save(function(err){
      if(!err){
          console.log('修改成功');
      }else{
         throw err;
      }
   });
});
  

4.2.6  查詢數據

下麵find第一個參數{}裡面為空,表示查詢所有的數據:
docs表示查詢的結果集合。
 
studentQueryModel.find({},function(err,docs){
         console.log(docs);
});

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、查詢的時候把某一個欄位的值拼接成字元串 以下是演示數據。 第一種方式:使用自定義變數 這種方法有一個好處就是,拼接出來的字元串可以賦值給變數或直接插入表中指定欄位,可以適用於存儲過程之類的。 第二種方式:轉換為 XML 格式 使用這種方式有一個缺點就是,不能直接賦值給變數或插入表,適用於查看時使 ...
  • [20170627]使用TSPITR恢復表空間.txt--//RMAN提供了一種實現所謂TSPITR(Tablespace Point-In-Time Recovery)的技術,通過簡單的一個語句,就可以在主庫不停庫(很吸引人)--//的情況下,利用備份集和連續的歸檔日誌,實現表空間級別的定點恢復。 ...
  • 1、數據 定義:描述事物的符號。例如:文本、音頻、視頻都是數據。 2、資料庫 存放數據的倉庫,存放在電腦中,按照一定格式存放,可以為用戶共用。 3、資料庫的發展階段 1、網狀資料庫 2、層次資料庫 3、關係資料庫(目前主流資料庫) 4、對象資料庫 4、NOSQL資料庫 4、Oracle資料庫系統用 ...
  • 一、SCAN 概念 SCAN(Single Client Access Name)是 Oracle從11g R2開始推出的,客戶端可以通過 SCAN 特性負載均衡地連接到 RAC資料庫 SCAN 最明顯的優點就是,當集群中新增加了節點或者刪除了節點,不需要額外維護客戶端 查看 SCAN 的配置信息的 ...
  • 一次mysql主從同步解決過程 前天進行表結構的修改,將其中一個表進行欄位結構的擴展,從varchar(30)擴展到varchar(50),表數據是120萬多條,在主庫執行起來只用了40秒,而從庫同步卻要用4小時。 雖然主庫執行很快,但是影響的行數是120萬行,從庫是同步120萬行的結構變化而去,而 ...
  • 數據類型:數據類型時指列,存儲過程參數、表達式和局部變數的數據特征,它決定了數據的儲存格式,代表了不同的信息類型。(比如整數、字元、浮點數、日期、等等等……) 選擇數據類型要選擇最合理、最合適的數據類型,而不是最大的數據類型。 整數的五種類型: (整數就是像-3,-2,-1,0,1,2,3,10等這 ...
  • 一、事務1、提交2、回滾3、ACID特性二、視圖1、創建視圖2、刪除視圖3、更新視圖4、使用視圖三、子查詢1、 使用子查詢2、 標量子查詢3、 關聯子查詢一、事務在 RDBMS 中,事務是對錶中數據進行更新的單位。簡單來講,事務就是需要在同一個處理單元中執行的一系列更新處理的集合。事務開始語句STA... ...
  • Sql Server2005資料庫自帶一個排序函數ROW_NUMBER(),列表為: 語法:row_number() : over(子句)1.使用row_number()函數進行編號: 原理:先按Sage進行排序,排序完後,給每條數據進行編號。註:在使用over等開窗函數時,over裡頭的分組及排序 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...