1. 程式人生 > >Nodejs學習筆記(十)--- 與MongoDB的互動(mongodb/node-mongodb-native)、MongoDB入門

Nodejs學習筆記(十)--- 與MongoDB的互動(mongodb/node-mongodb-native)、MongoDB入門

目錄

簡介

  MongoDB 

  開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性;

  node-mongodb-native

  mongodb的nodejs驅動;

MongoDB安裝(windows)

  按照官方說明在win7 64位環境下配置還是遇到了問題,我還是把我安裝配置的過程寫一下

  下載MongoDB並安裝

  建立資料庫和日誌存放目錄

  在C盤根目錄下新建“M_DB”和“M_LOG”兩個資料夾,分別存放資料庫檔案和日誌檔案

  建立一個config檔案

  開啟目錄“C:\Program Files\MongoDB 2.6 Standard\bin”,並在此目錄下新建一個mongo.config檔案,檔案內容如下

##資料庫目錄
dbpath=C:\M_DB

##日誌輸出檔案
logpath=C:\M_LOG\mongodb.log

  新增環境變數

  在環境變數PATH中加入“C:\Program Files\MongoDB 2.6 Standard\bin“

  以Windows伺服器執行MongoDB

  以管理員方式開啟CMD視窗,執行如下命令安裝MongoDB服務,可以在 “控制面板\所有控制面板項\管理工具\服務”找到名為“MongoDB”的服務右鍵啟動

mongod --config "C:\Program Files\MongoDB 2.6 Standard\bin\mongo.config
" --install

  啟動服務

  在CMD視窗中執行如下命令,也可以在可以在 “控制面板\所有控制面板項\管理工具\服務”

net start mongodb

  測試連線

  在CMD中執行如下命令,檢視結果

mongo

  

  安裝成功!

  最後兩步非必需;MongoDB預設埠是27017,可以修改!

  對於“C:\Program Files\MongoDB 2.6 Standard\bin”目錄下的exe程式,做個簡單的說明,可能更利於瞭解可以做些什麼操作,基礎學習關注mongod.exe和mongo.exe即可

  mongo.exe:客戶端,支援js語法

  mongod.exe:服務端

  mongodump.exe:備份工具

  mongorestore.exe:恢復工具

  mongoexport.exe:匯出工具

  mongoimport.exe:匯入工具

  mongostat.exe:實時效能監控工具

  mongotop.exe:跟蹤MongDB例項讀寫時間工具

MongoDB基本語法和操作入門(mongo.exe客戶端操作)

  MongoDB已經安裝好,下面先對MongoDB進行一個簡單的入門,再用node-mongodb-native去操作MongoDB

  庫操作

  新建資料庫:第一步:use 新建資料庫名;第二步:進行此庫相關的操作;如果不進行第二步,該資料庫不會被建立

  檢視資料庫:show dbs;

  新建表:db.createCollection('要新建的表名');

  檢視當前資料庫下表: show collections;

  刪除當前資料庫指定表:db.表名.drop();

  刪除當前資料庫:db.dropDatabase();

  示例操作如下圖:

  

  1.預設為存在“admin”和“local”兩個資料庫;admin資料庫是存放管理員資訊的資料庫,認證會用到;local是存放replication相關的資料;這兩處本篇都沒有涉及到;

  2.find();是個查詢操作,後面會講到,上面用到主要是為了演示use不存在的庫後,進行相關操作會創建出這個庫;

  3.MongoDB沒有像MySQL或MSSQL等資料庫這麼嚴格的規定,不是非得要先建庫、建表、建各種欄位,以後的操作中慢慢的會體會到^_^!

  插入

  方法一:db.表名.insert(資料);

  

  1.從上圖操作可以看出,沒有去建立“tb1”表,其實通過插入操作也會自動建立

  2._id,是mongodb自已生成的,每行資料都會存在,預設是ObjectId,可以在插入資料時插入這個鍵的值(支援mongodb支援的所有資料型別)  

  方法二:db.表名.save(資料);

     

  1.從上圖操作可以看出,save也可達到insert一樣的插入效果

  2._id可以自已插入

  3.一個表中不一定要欄位都相同

  那它們有什麼區別?

  

  從圖中操作就可以看出,雖然insert和save方法都可以插入資料,當預設的“_id”值已存在時,呼叫insert方法插入會報錯;而save方法不會,會更新相同的_id所在行資料的資訊

  查詢

  查詢表中所有資料:db.表名.find();

  按條件查詢(支援多條件):db.表名.find(條件); 

  查詢第一條(支援條件):db.表名.findOne(條件);

  限制數量:db.表名.find().limit(數量);

  跳過指定數量:db.表名.find().skip(數量);

  

  從上圖中可以看出具體用法,批量插入預設資料我用了一個javascript語法迴圈;

  比較查詢

  大於:$gt

  小於:$lt

  大於等於:$gte

  小於等於:$lte

  非等於:$ne

  

  上面看到了AND的關係,或者的關係應該怎麼用?

  或者:$or

  

  in和not in查詢(包含、不包含)   $in   $nin    

  查詢數量:db.表名.find().count();

  排序:db.表名.find().sort({"欄位名":1}); 

     1:表示升序  -1:表示降序

  指定欄位返回: db.表名.find({},{"欄位名":0});  

     1:返回  0:不返回

  

  查詢就講到這裡了,感覺查詢示例一下講不完,還有些高階查詢,大家自行去了解一下吧^_^!

  修改

  前面save在_id欄位已存在是就是修改操作,按指定條件修改語法如下

  db.表名.update({"條件欄位名":"欄位值"},{$set:{"要修改的欄位名":"修改後的欄位值"}});

  

  刪除

  db.表名.remove(條件);

  

  儲存過程

   建立儲存過程:

db.system.js.save({_id:"儲存過程ID", 
value:function(引數){  
        -- 邏輯主體; 
        return 返回; 
}});                

  呼叫儲存過程

db.eval("儲存過程ID()");

  

  所有儲存過程都存放在db.system.js中

  MongoDB基本操作就講這麼多了,基本夠用,深入學習大家自已去看看API^_^!

nodejs操作MongoDB

  先用npm安裝mongodb

npm install mongodb

  安裝成功後,繼續在上面操作建立的庫和表中操作

  插入

var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';    

var insertData = function(db, callback) {  
    //連線到表  
    var collection = db.collection('tb2');
    //插入資料
    var data = [{"name":'wilson001',"age":21},{"name":'wilson002',"age":22}];
    collection.insert(data, function(err, result) { 
        if(err)
        {
            console.log('Error:'+ err);
            return;
        }     
        callback(result);
    });
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("連線成功!");
    insertData(db, function(result) {
        console.log(result);
        db.close();
    });
});
示例原始碼

  查詢

 

var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';  

var selectData = function(db, callback) {  
  //連線到表  
  var collection = db.collection('tb2');
  //查詢資料
  var whereStr = {"name":'wilson001'};
  collection.find(whereStr).toArray(function(err, result) {
    if(err)
    {
      console.log('Error:'+ err);
      return;
    }     
    callback(result);
  });
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
  selectData(db, function(result) {
    console.log(result);
    db.close();
  });
});
示例原始碼

  修改

var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';    

var updateData = function(db, callback) {  
    //連線到表  
    var collection = db.collection('tb2');
    //更新資料
    var whereStr = {"name":'wilson001'};
    var updateStr = {$set: { "age" : 100 }};
    collection.update(whereStr,updateStr, function(err, result) {
        if(err)
        {
            console.log('Error:'+ err);
            return;
        }     
        callback(result);
    });
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("連線成功!");
    updateData(db, function(result) {
        console.log(result);
        db.close();
    });
});
示例原始碼

  刪除

var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';  

var delData = function(db, callback) {  
  //連線到表  
  var collection = db.collection('tb2');
  //刪除資料
  var whereStr = {"name":'wilson001'};
  collection.remove(whereStr, function(err, result) {
    if(err)
    {
      console.log('Error:'+ err);
      return;
    }     
    callback(result);
  });
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
  delData(db, function(result) {
    console.log(result);
    db.close();
  });
});
示例原始碼

  呼叫儲存過程

var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';    

var invokeProcData = function(db, callback) {  
    //儲存過程呼叫
    db.eval('get_tb2_count()', function(err, result) { 
        if(err)
        {
            console.log('Error:'+ err);
            return;
        }             
        callback(result);
    });
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("連線成功!");
    invokeProcData(db, function(result) {
        console.log(result);
        db.close();
    });
});
示例原始碼

  到此CRUD操作就完成,通過回撥函式的result引數進行判斷都可以進行業務邏輯的進一步組合!

寫在之後...

  mongoose的可能用的比較多...

  本文中很多地方我都還是習慣的用表、行等術語去描述,其實對NoSQL來說並不對,只是有助於習慣了關係型資料庫的開發人員來解;

  文章中“表”本應該描述為“collection(集合)”;“行”應該描述為“文件(document)”,一個database中可以有多個collection,一個collection中又可以有多個document

  文章中並沒有涉及認證的部分,大家自行去補一下,非常簡單,我文中也挺到了兩個預設資料庫中的“admin”資料庫

  用CMD中使用mongo.exe操作時,插入中文遇一了問題,原因是MongoDB預設編輯是utf-8,而CMD是GBK,所以在CMD視窗中執行這個命令修改編輯即可:chcp 65001

  注意mongodb嚴格區分大小寫,比如查詢 db.tb2.find({"name":"wilson0"})和 db.tb2.find({"Name":"wilson0"}) 並不是用的同一欄位做的條件;

  主要參考資料:

  MongoDB權威指南

相關推薦

Nodejs學習筆記MySQL互動felixge/node-mysql

                目錄簡介和安裝 測試MySQL 認識一下Connection Opti

Nodejs學習筆記--- MySQL互動felixge/node-mysql

目錄 簡介和安裝   我選擇了felixge/node-mysql,用的人比較多,先隨大溜看看它的使用,暫時沒有太過糾結於各庫之間的執行效能問題,對其它庫有研究的筒子也可以分享一下效能要求較高時的選擇^_^!  This is a node.js driver for mys

GO學習筆記——GO語言變數變數定義5

上一篇說完了GO語言的基本資料型別,這一篇就來說說怎麼定義各種不同型別的變數吧 GO語言中變數定義需要使用關鍵字var,並且GO語言中定義變數是和C++定義變數相反的,C++是變數型別在前,變數名在後;而GO是變數名在前,變數型別在後。這是它們之間在定義變數時最明顯的不同

學習筆記javascript設計模式開發實踐釋出--訂閱模式----8】

第8章 釋出—訂閱模式 釋出—訂閱模式又叫觀察者模式,它定義物件間的一種一對多的依賴關係,當一個物件的狀態發生了改變時,所有依賴於它的物件都將得到通知。在javascript開發中,我們一般都用事件模型來替代傳統的釋出—訂閱模式。 8.1 現實中的釋出—訂閱模式 不論是在程

學習筆記javascript設計模式開發實踐代理模式----6】

第6章代理模式  代理模式是為一個物件提供一個代用品或佔位符,以便控制對它的訪問。 代理模式是一種非常有意義的模式,在生活中可以找到很多代理模式的場景。比如明星都有經濟人作為代理。如果想請明星來辦一場商業演出,只能聯絡他的經紀人,經紀人會把演出的細節和報酬都談好之後,再把合

[學習筆記]變數的定義作用範圍使用

變數的命名規則:1.變數名由字母、數字、下滑線組成 但是不能以數字開頭2.不能使用javascript中的關鍵字3.嚴格區分大小寫 變數的宣告一般格式:var 變數名=變數值;可以使用一個var宣告多

Nodejs學習筆記— Mongoose介紹和入門 && Nodejs學習筆記--- MongoDB互動mongodb/node-mongodb-nativeMongoDB入門

目錄 簡介   MongoDB    開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性;   node-mongodb-native   mongodb的nodejs驅動; MongoDB安裝(windows)   按照官方說明在win7 64位

Nodejs學習筆記--- MongoDB互動mongodb/node-mongodb-nativeMongoDB入門

目錄 簡介   MongoDB    開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性;   node-mongodb-native   mongodb的nodejs驅動; MongoDB安裝(windows)   按照官方

Nodejs學習筆記--- 操作MongoDB數據庫

效果 view asc erro eve mongdb splay play 所有 最近看了一些關於mongodb的文章,然後就想知道nodeJS是怎麽連接的所以我就嘗試去了解了一波(這個菜鳥驛站這個網站還不錯,雖然知識文檔不是最新的,但是還是蠻好的;   順便官網地址是

Nodejs學習筆記—Express安裝入門模版引擎ejs

num routes 項目目錄 其中 bubuko 執行 ctrl+ ica 開發經驗 前言   前面也學習了一些Node.js的基本入門知道,現在開始進入Web開發的部分;   Node.js提供了http模塊,這個模塊中提供了一些底層接口,可以直接使用,但是直接開發網站

Nodejs學習筆記MySQL交互felixge/node-mysql

ted iss eid 所在 err password soc deb 大連 簡介和安裝   Node.js與MySQL交互操作有很多庫,具體可以在 https://www.npmjs.org/search?q=mysql 查看。   我選擇了felixge/node-m

Nodejs學習筆記—Mongoose介紹和入門

tar 字段名 lse number 數組 int 位置 斷開 mongod 簡介   Mongoose是在node.js異步環境下對mongodb進行便捷操作的對象模型工具   那麽要使用它,首先你得裝上node.js和mongodb,關於mongodb的安裝和操作介紹可

Nodejs學習筆記—Pomelo介紹&入門

錯誤信息 develop prototype client 之前 clas zhong 早已 express 前言&介紹   Pomelo:一個快速、可擴展、Node.js分布式遊戲服務器框架   從三四年前接觸Node.js開始就接觸到了Pomelo,從Pomel

Nodejs學習筆記—數據采集器示例request和cheerio

列表 意思 9.1 很多 AD 開發 com http undefined 寫在之前   很多人都有做數據采集的需求,用不同的語言,不同的方式都能實現,我以前也用C#寫過,主要還是發送各類請求和正則解析數據比較繁瑣些,總體來說沒啥不好的,就是效率要差一些,   用nodej

Nodejs學習筆記—定時任務node-schedule)

sch 接下來 bsp 消息 分享 學習筆記 day 筆記 定時器 寫在之前   在實際開發項目中,會遇到很多定時任務的工作。比如:定時導出某些數據、定時發送消息或郵件給用戶、定時備份什麽類型的文件等等   一般可以寫個定時器,來完成相應的需求,在node.js中自已實現也

Nodejs學習筆記—浮點運算decimal.js

學習筆記 存儲 log title ron 學習 decimal 安裝 bit 前言   開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾   JavaScript 只有一種數字類型 ( Number )    JavaScript采用

Nodejs學習筆記--- 定時任務node-schedule)

目錄 寫在之前   在實際開發專案中,會遇到很多定時任務的工作。比如:定時匯出某些資料、定時傳送訊息或郵件給使用者、定時備份什麼型別的檔案等等   一般可以寫個定時器,來完成相應的需求,在node.js中自已實現也非常容易,接下來要介紹的是node-schedule來完成定時任務   下面就用

Nodejs學習筆記--- Redis的互動mranney/node_redis入門

目錄 簡介和安裝 redis簡介: 開源高效能key-value儲存;採用記憶體中(in-memory)資料集的方式,也可以採用磁碟儲存方式(前者效能高,但資料可能丟失,後者正好相反) 支援字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集

Nodejs學習筆記--- 浮點運算decimal.js

目錄 前言  開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾  JavaScript 只有一種數字型別 ( Number )  JavaScript採用 IEEE 754 標準雙精度浮點(64),64位中 1位浮點數中符號,11儲存指數,52位儲存浮點數的有效

Nodejs學習筆記--- 資料採集器示例request和cheerio

目錄 寫在之前   很多人都有做資料採集的需求,用不同的語言,不同的方式都能實現,我以前也用C#寫過,主要還是傳送各類請求和正則解析資料比較繁瑣些,總體來說沒啥不好的,就是效率要差一些,   用nodejs寫採集程式還是比較有效率(可能也只是相對C#來說),今天主要用一個示例來說一下使用node