1. 程式人生 > >node.js之mongodb資料庫

node.js之mongodb資料庫

安裝配置

Mongodb官網下載最新版本的Mongodb下載地址

下載msiwindow安裝包,可以裝到C盤或者D盤目錄下

配置

由於我是安裝在D盤的環境下

D:\Program Files (x86)\MongoDB\Server\3.2\bin

所以在bin資料夾下找到mongod.exe命令,然後通過管理員執行mongod --dbpath x路徑x,路徑可以是任何地方,我這裡選擇在D盤的MongoDB目錄下,當然路徑不要包含特殊的字串,比如Program Files (x86)也不行

mongod --dbpath D:\mongodb\data\db

在安裝過程中要注意配置環境變數(win10一般會預設配置),配置完成後開啟命令列輸入mongod顯示下面資訊,即表示配置成功。

在這裡插入圖片描述

命令列

經過上面的配置之後,就可以返回bin目錄下找到mongo.exe命令,並管理員下執行,就可以出現mongodb的命令列模式

D:\Program Files (x86)\MongoDB\Server\3.2\bin

在這裡插入圖片描述

然後就可以使用下面的命令來測試了

db.help()//幫助
db.stats()//統計

顯示資料庫

show dbs

檢查當前選擇的資料庫

db

新增資料庫

資料庫名

為資料庫建立的名字,使用該命令後會預設切換到對應的資料庫,並且在資料庫中新增選項,資料庫資訊才顯示,如果預設就有該資料庫,那就是切換到對應的資料庫裡面

use 資料庫名

刪除資料庫

先切換到對應的資料庫,然後再執行db.dropDatabase()刪除該資料庫

use 資料庫名
//switched to db 資料庫名
db.dropDatabase()

顯示集合

用一下命令可以檢查建立的集合

show collections

新增集合

在建立完資料庫之後,我們就可以建立集合

db.createCollection(集合名字name,設定引數options[
物件型別])

name是要建立的集合的名稱。 options是一個文件,用於指定集合的配置

引數 型別 描述
name String 要建立的集合的名稱
options Document (可選)指定有關記憶體大小和索引的選項
options引數是可選的,因此只需要指定集合的名稱。 以下是可以使用的選項列表:

欄位 型別 描述
capped Boolean (可選)如果為true,則啟用封閉的集合。上限集合是固定大小的集合,它在達到其最大大小時自動覆蓋其最舊的條目。 如果指定true,則還需要指定size引數。
autoIndexId Boolean (可選)如果為true,則在_id欄位上自動建立索引。預設值為false。
size 數字 (可選)指定上限集合的最大大小(以位元組為單位)。 如果capped為true,那麼還需要指定此欄位的值。
max 數字 (可選)指定上限集合中允許的最大文件數。
由於option是可選,我們也可以不帶配置項建立集合

db.createCollection("mycollection")

刪除集合

db.collection.drop()用於從資料庫中刪除集合

db.集合名.drop()

比如我們可以測試以下操作

db.createCollection("wscats")//建立名為wscats的集合
show collections//顯示該資料庫所有集合   wscats
db.wscats.drop()//刪除名為wscats的集合

檢視文件

最簡單檢視文件的方法就是find(),會檢索集合中所有的文件結果

db.集合名.find()

要以格式化的方式顯示結果,可以使用pretty()方法。

db.集合名.find().pretty()

1.固值尋找

尋找age集合裡面所有含有屬性值為wscats的文件結果,相當於where name = 'wscats'

db.age.find({name:"wscats"})

2.範值尋找

操作 語法 示例 等效語句
相等 {:} db.age.find({"name":"wscats"}).pretty() where name = ‘wscats’
小於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 4: lt:}̲} `db.age.find(…lt:50}}).pretty()where likes < 50 小於等於 {:{$lte:}}db.age.find({“likes”:{KaTeX parse error: Expected 'EOF', got '}' at position 7: lte:50}̲}).pretty()` wh…gt:}} db.age.find({"likes":{$gt:50}}).pretty() where likes > 50
大於等於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 5: gte:}̲} `db.age.find(…gte:50}}).pretty()where likes >= 50 不等於 {:{$ne:}}db.age.find({“likes”:{$ne:50}}).pretty()` where likes != 50

3.AND和OR尋找

AND

在find()方法中,如果通過使用將它們分開傳遞多個鍵,則mongodb將其視為AND條件。 以下是AND的基本語法

尋找_id為1並且name為wscats的所有結果集

db.age.find(
   {
      $and: [
         {"_id": 1}, {"name": "wscats"}
      ]
   }
)

OR

在要根據OR條件查詢文件,需要使用$or關鍵字。以下是OR條件的基本語法

尋找name為corrine或者name為wscats的所有結果集

db.age.find(
   {
      $or: [
         {"name": "corrine"}, {“name“: "wscats"}
      ]
   }
)

AND和OR等結合

相當於語句where title = "wscats" OR ( title = "corrine" AND _id < 5)

db.age.find({
  $or: [{
    "title": "wscats"
  }, {
    $and: [{
      "title": "corrine"
    }, {
      "_id": {
        $lte: 5
      }
    }]
  }]
})

插入文件

文件的資料結構和JSON基本一樣。
所有儲存在集合中的資料都是BSON格式。
BSON是一種類json的一種二進位制形式的儲存格式,簡稱Binary JSON

要將資料插入到mongodb集合中,需要使用mongodb的insert()save()方法。

db.集合名.insert(document)

比如我們可以插入以下資料

db.wscats.insert({
   _id: 100,
   title: 'MongoDB Tutorials', 
   description: 'node_tutorials',
   by: 'Oaoafly',
   url: 'https://github.com/Wscats/node-tutorial',
   tags: ['wscat','MongoDB', 'database', 'NoSQL','node'],
   num: 100,
})

也可以支援插入多個,注意傳入的是陣列形式

db.wscats.insert([{
   _id: 100,
   title: ‘Hello’
},{
   _id: 101,
   title: ‘World’
}])

在插入的文件中,如果不指定_id引數,那麼mongodb會為此文件分配一個唯一的ObjectId
要插入文件,也可以使用db.post.save(document)。如果不在文件中指定_id,那麼save()方法將與insert()方法一樣自動分配ID的值。如果指定_id,則將以save()方法的形式替換包含**_id**的文件的全部資料。

db.wscats.save({
   _id: 111,
   title: 'Oaoafly Wscats', 
})

更新文件

1.update()方法

尋找第一條title為wscats的值,並且更新值title為corrine和age為12

db.age.update({
  'title': 'wscats'
}, {
  $set: {
    'title': 'corrine',
    'age': 12
  }
})

預設情況下,mongodb只會更新一個文件。要更新多個文件,需要將引數multi設定為true,還可以配合find方法裡面的各種複雜條件判斷來篩選結果,然後更新多個文件

尋找所有title為wscats的值,並且更新值title為corrine和age為12

db.age.update({
  'title': 'wscats'
}, {
  $set: {
    'title': 'corrine',
    'age': 12
  }
}, {
  multi: true
})

2.save()方法

_id主鍵為3的文件,覆蓋新的值,注意_id為必傳

db.age.save({
  '_id':3,
  'title': 'wscats'
})

刪除文件

刪除主鍵_id為3的文件,預設是刪除多條

db.age.remove({
  '_id':3
})

建議在執行remove()函式前先執行find()命令來判斷執行的條件是否正確

如果你只想刪除第一條找到的記錄可以設定justOne為1,如下所示

db.age.remove({...},1)

全部刪除

db.age.remove({})

Limit與Skip方法

Limit

如果你需要在mongodb中讀取指定數量的資料記錄,可以使用mongodb的Limit方法,limit()方法接受一個數字引數,該引數指定從mongodb中讀取的記錄條數。

db.age.find().limit(數量)

Skip

我們除了可以使用limit()方法來讀取指定數量的資料外,還可以使用skip()方法來跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數。

db.age.find().limit(數量).skip(數量)
//skip()方法預設值為0

所以我們在實現分頁的時候就可以用limit來限制每頁多少條資料(一般固定一個值),用skip來決定顯示第幾頁(一個有規律變動的值)

排序

在mongodb中使用使用sort()方法對資料進行排序,sort()方法可以通過引數指定排序的欄位,並使用1和-1來指定排序的方式,其中1為升序排列,而-1是用於降序排列。

1 升序排列
-1 降序排列

db.集合名.find().sort({鍵值(屬性值):1})

age集合表重新根據_id主鍵進行降序排列

db.age.find().sort({
  "_id": -1
})

Node.js連線

安裝mongodb的模組

npm install mongodb

1.連線資料庫

var MongoClient = require('mongodb').MongoClient;
//結尾是選擇資料庫名
var DB_CONN_STR = 'mongodb://localhost:27017/wscats';
MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
});

需要在命令列下載安裝mongodb模組

2.查詢資料

注意查詢回來的結果需要toArray來遍歷處理

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

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
  //選中age集合,並用find方法把結果集拿回來進行處理
  db.collection("age").find({title: "cba"}).toArray(function(err, result) {
    if (err) {
      console.log('Error:' + err);
      return;
    }
    console.log(result);
  });
});

經過測試,讀取大於100條的時候會出現報錯官網解釋,可以嘗試用forEach代替

db.collection('pokemon').find({})
  .forEach(function(item){
      console.log(item)
  })

查詢ID

查詢自動生成的ObjectId

var ObjectId = require('mongodb').ObjectId;
let _id = ObjectId("5bcae50ed1f2c2f5e4e1a76a");
db.collection('xxx').find({
    "_id": _id
}).forEach(function (item) {
    console.log(item)
})

3.插入資料

insert函式第一個引數是需要插入的值(可以一個也可以多個),第二個引數是接受一個回撥函式,當值插入成功後回返回插入值得一些關鍵資訊,比如_id

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

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
	const db = client.db("demo");
  db.collection("age").insert([
    { 
      title: "插入的值A"
    }, {
      title: "插入的值B"
    }
  ], function(err, result) {
    if (err) {
      console.log('Error:' + err);
      return;
    }
    console.log(result)
  })
});

4.更新資料

注意如果不加 s e t ( ) set就是完全替換原來的那份(沒有設定的屬性值將會丟失),加上 set則只是更新對應的屬性值,其餘不做改變

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

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
  db.collection("age").update({
    "_id": 1
  }, {
    $set: {
      title: "你好,世界",
      skill: "js"
    }
  }, function(err, result) {
    if (err) {
      console.log('Error:' + err);
      return;
    }
    //console.log(result);
  });
});

5.刪除資料

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

MongoClient.connect(DB_CONN_STR, function(err, db) {
  console.log("連線成功!");
  db.collection("age").remove({
    "_id": 1
  }, function(err, result) {
    if (err) {
      console.log('Error:' + err);
      return;
    }
    //console.log(result);
    //關閉資料庫
    db.close();
  });
});

6.關閉資料庫

db.close();

封裝自定義模組

新建mongo.js寫入以下程式碼,封裝自定義模組,方便其他路由複用,注意assert是node自帶的斷言模組,用於測試程式碼

參考

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'shop';
function query(callback) {
	MongoClient.connect(url, function(err, client) {
		assert.equal(null, err);
		console.log("Connected successfully to server");
		const db = client.db(dbName);
		callback(db);
		client.close();
	});
}
module.exports = {
	query
}

在路由檔案中引入和使用

var mongo = require('./mongo.js')
router.post('/addproduct', function(req, res, next) {
	mongo.query(function(db) {
		db.collection("product").insertMany([req.body], function(err, result) {
			console.log("Inserted 1 document into the collection");
			res.send('respond with a resource');
		});
	})
});

視覺化

參考文件