node.js之mongodb資料庫
安裝配置
在
Mongodb
官網下載最新版本的Mongodb下載地址下載
msi
的window
安裝包,可以裝到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 != 503.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.更新資料
注意如果不加 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'); }); }) });
視覺化
參考文件