nodejs筆記--與MongoDB的互動篇(七)

來源:互聯網
上載者:User

標籤:

原文地址:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html

目錄
  • 簡介
  • MongoDB安裝(windows)
  • MongoDB基本文法和操作入門(mongo.exe用戶端操作)
    • 庫操作
    • 插入
    • 查詢
    • 修改
    • 刪除
    • 預存程序
  • nodejs操作MongoDB
    • 插入
    • 查詢
    • 修改
    • 刪除
    • 調用預存程序
  • 寫在之後...
簡介

  MongoDB 

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

  NoSQL畢竟還處於發展階段,也有說它的各種問題的:http://coolshell.cn/articles/5826.html

    官網地址:http://www.mongodb.org/

  API Docs:http://docs.mongodb.org/manual/

  node-mongodb-native

  mongodb的nodejs驅動;

  GitHub地址:https://github.com/mongodb/node-mongodb-native

MongoDB安裝(windows)

  官方安裝說明: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/

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

  

  下載MongoDB並安裝

  :http://www.mongodb.org/downloads

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

  在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執行個體讀寫時間工具

 

  更多詳細解釋或操作可以查看:http://docs.mongodb.org/manual/reference/program/

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參數進行判斷都可以進行商務邏輯的進一步組合!

寫在之後...

  本篇針對node-mongodb-native操作MongoDB沒有做更深的講解,原因是針對它的進行再次封裝的東西很多,且更利於編程實現,比如:mongoose、mongoskin、mongolian等等,應用性不錯;

  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"}) 並不是用的同一欄位做的條件;

 

  主要參考資料:

  http://docs.mongodb.org/manual/

  https://github.com/mongodb/node-mongodb-native

  MongoDB權威指南

nodejs筆記--與MongoDB的互動篇(七)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.