初嘗 mongodb+node.js

前言:你們這些不好好寫接口的後臺,非要逼着前端一統天下。純屬開玩笑哈,第一次寫跟後臺相關的東西,當揭開後臺神祕的面紗的時候,那種驚喜、開心、成就感讓我重回當初寫出第一個hello world的時候。

由於我是用的是win10系統就以windows爲基礎說啊,linux和mac os的自行解決哈,不過應該也是大同小異的。

1. 安裝

mongodb的下載和安裝就不說了啊,還沒有下載安裝的自行去Mongodb 官網下載安裝即可。

2.創建data 

這部分內容主要參考 NodeJS+Express+MongoDB 的文章,我主要說一下踩到的坑和遇到的錯誤處理

安裝好之後,在根目錄下創建data文件夾,我是放在e盤裏的。

e:\data\db用於存放mongodb的數據文件

e:\data\log用於存放mongodb的日誌文件

  錯誤處理

    1. 使用net start mongodb命令啓動MongoDB服務發生系統錯誤,返回值爲5

      解決方法:cmd使用管理員身份打開即可,到C:\Windows\System32找到cmd.exe然後以管理員的身份運行。爲了避免每次啓  動都要查找一次cmd文件,我把cmd放在了開始菜單裏,右鍵固定在開始菜單就好了。

    2. 使用net start mongodb命令啓動mongodb系統出錯。 發生系統錯誤 1067。 進程意外終止。

      解決方法:MongoDB安裝目錄\data\將此文件夾下的mongod.lock刪除,我沒有遇到這個問題,也不知道能不能正確解決,有踩過坑的可以說一下。

    3. 使用net stop mongodb命令啓動mongodb系統出錯。 發生系統錯誤 1067。 進程意外終止。

      我在start的時候是正常啓動的,但是在stop的時候報錯了,但是最後還是正常stop了,上面所說的mongod.lock或者mongod.cfg我都沒有,也不知道如何解決,知道怎麼解決的大佬還請賜教,謝謝,鞠躬鞠躬!

    注:解決了之後一定要重啓服務纔會生效哦。

3.啓動 

還是繼續參考上一邊文章
    1.命令行
    ## 開始服務
    net start mongodb

    ## 停止服務 nginxstop並不會關閉服務,需要使用kill,事實證明win10下stop是可以正常停止服務的
    net stop mongodb

    2.在mongodb的安裝目錄下,E:\Program Files\MongoDB\Server\3.4\bin 下的mongo.exe文件 ,也可以放在開始裏面,右鍵固定在開始菜單就好了

    3.可視化工具robomongo

        下載傳送門    選擇 Robo 3T 即可,選擇第二個綠色版本即可,下載下來解壓直接運行.exe文件就可以了,當然了這個也可以放在開始,右鍵固定在開始菜單就好了。

Robo 3T 下載截圖

4.管理員  

參考 NodeJS入門——準備工作(2)——MongoDB安裝以及客戶端Robomongo安裝和使用
    1.重新打開一個命令行窗口,切換到Mongodb安裝路徑下bin文件夾內
    2.輸入命令: mongo,輸入命令 use  admin切換到admin數據庫
    3.輸入命令  db.addUser('admin','admin')  添加管理員賬戶 這是以前的版本
    新版本應使用 ad.createUser({user:"admin",pwd:"admin",roles:[]})  

    新版本的命令參考

5.數據庫操作

使用robo3T robomongo工具
    1.創建和刪除數據庫
        可以使用圖形界面右鍵create database創建數據庫,右鍵Drop Database刪除數據庫
        也可以使用命令行來操作:
            1.創建數據庫gomall:  use gomall    
                                  db
            2.刪除數據庫gomall:use gomall
                                db.dropDatabase()
    2.數據庫操作命令:
        先打開shell腳本編寫界面
        1.insert:
            命令:db.表名.insert(數據); 
            例子:db.products.insert({name:"iphone",price:1988});
            說明:insert操作會自動創建products表,_id,是mongodb自已生成的,每行數據都會存在,默認是ObjectId,可以在插入數據時插入這個鍵的值(支持mongodb支持的所有數據類型)
            查看數據:db.getCollection('products').find({});
            3.2 版本後還有以下幾種語法可用於插入文檔:
            db.collection.insertOne():向指定集合中插入一條文檔數據
            db.collection.insertMany():向指定集合中插入多條文檔數據
        2.save
            命令:db.表名.save.(數據);
            例子:db.proctus.save({_id:2,name:"HuaWei P10",price:2999});
            說明:_id可以自已插入、一個表中不一定要字段都相同,雖然insert和save方法都可以插入數據,當默認的“_id”值已存在時,調用insert方法插入會報錯;而save方法不會,會更新相同的_id所在行數據的信息。
        3.批量添加
            for(var i = 0; i < 5; i ++) db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
            for(let i = 0; i < 5; i ++) db.users.save({'_id':i,'name':`zhangguo${i}`,'age':i+8});
        4.查詢數據
            1.查詢集合中所有數據
                命令: db.集合.find();
                例子:db.users.find({name:'zhangguo0'});
                     db.getCollection('users').find({}); 
                     db.users.find({});
                     db.users.find();
                其中,例子的後面三種寫法是相同的結果
            2.按條件查詢(支持多條件)
                命令:db.集合.find(條件);
                例子:db.users.find({name:'zhangguo0',age:9})
                說明:對象中的條件要求同時成立
            3.查詢第一條(支持條件)
                命令:db.集合.findOne(條件);
                例子:db.users.findOne({name:'zhangguo0'});
            4.限制數量
                命令: db.集合.find().limit(數量);
                例子: db.users.find({}).limit(3); 或 db.users.find().limit(3);  結果一樣
            5.跳過指定數量
                命令: db.表名.find().skip(數量);
                例子: db.users.find({}).skip(3); 
                      db.users.find({}).skip(2).limit(2);
            6.比較查詢

                 不同類型不會作比較,string和number不會作比較

                比較查詢的語法參考


                1.等於:$eq
                    格式:{<key>:<value>}
                          {<key>:{$eq:<value>}}
                    例子:db.users.find({age:10});
                          db.users.find({age:{$eq:10}});
                    說明:這兩種格式的結果是一樣的
                2.大於: $gt 
                    格式:{<key>:{$gt:<value>}}
                    例子:db.users.find({age:{$gt:10}});
                3.大於等於: $gte
                    格式:{<key>:{$gte:<value>}}
                    例子:db.users.find({age:{$gte:10}});
                4.小於: $lt
                    格式:{<key>:{$lt:<value>}}
                    例子:db.users.find({age:{$lt:10}});
                5.小於等於: $lte
                    格式:{<key>:{$lte:<value>}}
                    例子:db.users.find({age:{$lte:10}});
                6.不等於: $ne
                    格式:{<key>:{$ne:<value>}}
                    例子:db.users.find({age:{$ne:10}});
            7.查詢數量
                語法:db.表名.find().count();
                例子:db.users.find({}).count()
            8.排序
                 語法:db.表名.find().sort({"字段名":1});
                 例子:db.users.find({}).sort({}) 不能寫成db.users.find({}).sort()會報錯 "Failed to parse: sort: undefined. 'sort' field must be of BSON type object."
                            db.users.find({}).sort({age:-1,name:1});
                說明:1:表示升序;-1:表示降序;db.users.find({}).sort({}) 什麼都不傳按默認排序,默認是_id升序排序
           9.指定字段返回
                語法:db.表名.find({},{"字段名":0});
                例子:db.users.find({age:{$gt:9}},{_id:0,age:1,name:1});
                說明: 參數 1:返回 0:不返回
        5.修改
            1.修改符合條件的第一條:update
                語法:db.集合.update({"條件字段名":"字段值"},{$set:{"要修改的字段名":"修改後的字段值"}});
                例子:db.users.update({age:{$eq:9}},{$set:{age:100}});
                      db.users.update({age:9},{$set:{age:100}});
                說明:這兩種格式的例子結果是一樣的。前面save在_id字段已存在是就是修改操作。
            2.修改多條:updateMany
                例子: db.users.updateMany({age:{$gt:10}},{$set:{age:20}});
        6.刪除
            語法:db.集合.remove(條件);
            例子:db.users.remove({age:{$gte:10}});  // 刪除年齡>=10歲的數據

6.node.js訪問Mongodb

    前提:先用nodejs新建一個簡單的項目

    在當前項目中引入mongodb,可以不用全局安裝的。

       npm install mongodb --save

    在項目的根目錄下新建一個db.js文件,使用Node.js操作MongoDB。寫完之後運行 node db.js 即可。

下面附上Node.js操作MongoDB的完整代碼。主要主義的點是2.x和3.0以上的版本api接口有一點出入

// 引入客戶端mongodb模塊,獲得客戶端對象
const MongoClient = require('mongodb').MongoClient;
// 連接字符串
const DB_CONN_STR = 'mongodb://localhost:27017/gomall';

// 添加數據
const insertData = function (db, callback) {
  // 獲得指定的集合
  let collection = db.collection('users');
  // 插入數據
  let data = [{
    _id: 9,
    name: 'rose',
    age: 23
  }, {
    _id: 10,
    name: 'mark',
    age: 24
  }];

  // collection.insert(data, function (err, result) {  // mongodb 2.x的寫法 
  collection.insertMany(data, function (err, result) {
    // 如果存在錯誤
    if (err) {
      console.error('Error:', err);
      return;
    }

    // 調用傳入的回調方法,將操作結果返回
    callback(result);
  });
}

// 修改數據
const updateData = function (db, callback) {
  // 獲得指定的集合
  let collection = db.collection('users');
  // 要修改數據的條件,>=10歲的用戶
  let where = {
    age: {
      $gte: 10
    }
  };
  // 要修改的結果
  let set = {
    $set: {
      age: 95
    }
  };

  collection.updateMany(where, set, function (err, result) {
    // 如果存在錯誤
    if (err) {
      console.error('Error:', err);
      return;
    }
    // 調用傳入的回調方法,將操作結果返回
    callback(result);
  })
}

// 查詢數據
const findData = function (db, callback) {
  let collection = db.collection('users');
  let where = {
    age: {
      $eq: '22'
    }
  };
  let set = {
    name: 1,
    age: 1
  };

  collection.find(where, set).toArray(function (err, result) {
    if (err) {
      console.error('Error:', err);
      return;
    }
    callback(result);
  });

  // 刪除數據
  const deleteData = function (db, callback) {
    let collection = db.collection('users');
    let where = {
      age: {
        $eq: '21'
      }
    };
    collection.remove(where, function (err, result) {
      if (err) {
        console.error('Error:', err);
        return;
      }
      console.log(result);
      callback(result);
    })
  }



}

//使用客戶端連接數據,並指定完成時的回調方法
// MongoClient.connect(DB_CONN_STR, function (err, db) {  // 2.x的寫法
MongoClient.connect(DB_CONN_STR, {
  useNewUrlParser: true
}, function (err, client) { //// 3.0的寫法
  if (err) {
    console.error('數據庫連接失敗');
    return;
  }
  console.log('連接成功');
  // 執行插入數據操作,調用自定義方法
  let db = client.db('gomall'); // 3.0的寫法
  insertData(db, function (result) {
    // 顯示結果
    console.log(result);
    // 關閉數據庫
    client.close();
  });

  updateData(db, function (result) {
    // 顯示結果
    console.log(result);
    client.close();
  });

  findData(db, function (result) {
    console.log(result);
    client.close();
  });
  deleteData(db, function (result) {
    console.log(result);
    client.close();
  })
});

原文地址

感謝:

1. https://www.cnblogs.com/best/p/6212807.html

2.https://www.cnblogs.com/zhaord/p/4229001.html

3.https://blog.csdn.net/u010523770/article/details/54599548

4.http://www.runoob.com/mongodb/mongodb-query.html

是你們在我黑暗的路上打開了一盞路燈,謝謝!

以上就是我的踩坑記錄,願對你也有所幫助。

願聖光與你同在

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章