Node學習筆記 Mongodb 和 Mongoose
關係型資料庫 和 非關係型資料庫
-
關係型資料庫
- 最典型的資料結構是表
- 關係型資料庫是由二維表及其之間的聯絡所組成的一個資料組織
- 都需要使用
SQL
語言操作 - ……
-
非關係型資料庫
- 嚴格上不是一種資料庫,沒有
表
的概念,是一種資料結構化儲存方法的集合 - 資料結構由鍵值
(key => value)
對組成,類似於 JSON 物件 - 在非關係型資料庫中,
集合
相當於表
、文件物件
相當於表記錄
- ……
- 嚴格上不是一種資料庫,沒有
MongoDB
介紹
MongoDB
是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。
安裝
安裝檔案下載地址:[https://www.mongodb.com/download-center/community]
Windows 平臺安裝 MongoDB:https://www.runoob.com/mongodb/mongodb-window-install.html
在安裝過程中需要特別注意,需要將 Install MongoDB Compass
前預設的勾選取消
可以使用 mongod --version
命令檢視 MongoDB 版本,若版本號輸出正常則安裝完畢
啟動資料庫(三種方式)
-
cmd + cd到安裝路徑
// cmd命令列cd到安裝路徑 cd C:\Program Files\MongoDB\Server\3.4\bin // 然後cmd啟動MongoDB,執行cmd命令 mongod.exe --dbpath E:\db\MongoDB
-
按照如下順序,新增全域性變數
桌面 > 我的電腦 > 滑鼠右鍵選擇 > 屬性 > 高階系統屬性 > 環境變數 > 全域性變數 > 選擇編輯 Path,將 MongoDB 的安裝目錄新增到列表,如 C:\Program Files\MongoDB\Server\3.4\bin 然後,開啟 cmd 執行命令: mongod 最後,cmd 執行命令: mongod --dbpath E:\db\MongoDB // 修改資料庫位置
預設情況下,通過命令啟動的資料庫目錄在
命令執行所在碟符根目錄 /data/db
檔案伺服器和操作伺服器是兩個程式,可以修改預設資料庫路徑
mongod --dbpath '資料庫自擬路徑'
-
自定義 .bat 批處理檔案
在修改了全域性變數 path 的變數路徑之後,在本地新建一個文字文件,修改檔案字尾名為 .bat(.bat檔案命名:不能有空格出現,儘量英文,可使用下劃線間隔) 開啟該.bat批處理檔案,新增如下程式碼,並儲存檔案 echo "MongoDB starting.........." mongod --dbpath E:\db\MongoDB pause 滑鼠雙擊該批處理檔案,正常情況下,就會快速啟動 MongoDB 資料庫服務
關閉資料庫
mongod --shutdown
使用預設埠來連線 MongoDB 服務
mongo
資料庫操作
-
顯示所有已存在的資料庫
show dbs
在顯示的結果中
admin
、local
兩個結果為系統資料庫 -
刪除資料庫
db.dropDatabase()
刪除當前資料庫,預設為 test,你可以使用 db 命令檢視當前資料庫名
以下例項我們刪除了資料庫 runoob
> show dbs admin 0.000GB config 0.000GB local 0.000GB runoob 0.000GB
接下來我們切換到資料庫 runoob
> use runoob switched to db runoob
執行刪除命令
> db.dropDatabase() { "dropped" : "runoob", "ok" : 1 }
-
切換到目標資料庫
use demo
通過命令
use + 目標資料庫名
,既可切換到目標資料庫 -
檢視當前運算元據庫
db
通過
db
命令可以檢視當前操作的資料庫這裡需要注意的是,當資料庫中沒有資料時,資料庫不予顯示
-
顯示當前資料庫的所有集合
show collections
檢視當前
db
資料庫中存在的所有集合這裡需要注意的是,當集合中沒有資料時,合集不予顯示
-
顯示當前集合中所有資料
db.students.find()
通過
db. + 當前集合名稱 + .find()
可以檢視當前集合中的所有資料 -
向當前集合新增資料
db.students.insertOne({name: 'demo'})
通過
db. + 當前集合名稱 + .insertOne({ + 資料物件 + })
可以向當前集合中新增資料 -
斷開 MongoDB 服務
exit
-
斷開資料庫連結
db.shutdownServer()
MongoDB 備份與恢復
-
備份(mongodump)
在Mongodb中我們使用mongodump命令來備份MongoDB資料。該命令可以匯出所有資料到指定目錄中
mongodump命令指令碼語法如下:
mongodump -h dbhost -d dbname -o dbdirectory // -h:MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017 // -d:需要備份的資料庫例項,例如:test // -o:備份的資料存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫例項的備份資料
-
恢復(mongorestore)
mongodb使用 mongorestore 命令來恢復備份的資料
mongorestore命令指令碼語法如下:
mongorestore -h <hostname><:port> -d dbname <path> // --host <:port>, -h <:port>:MongoDB所在伺服器地址,預設為: localhost:27017 // --db , -d :需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2 // --drop:恢復的時候,先刪除當前資料,然後恢復備份的資料。就是說,恢復後,備份後新增修改的資料都會被刪除,慎用哦! // <path>:mongorestore 最後的一個引數,設定備份資料所在位置,例如:c:\data\dump\test。你不能同時指定 <path> 和 --dir 選項,--dir也可以設定備份目錄 // --dir:指定備份的目錄,你不能同時指定 <path> 和 --dir 選項
接下來我們執行以下命令:
mongorestore
Mongoose
介紹
Mongoose
是在 node.js 非同步環境下對 mongodb 進行便捷操作的物件模型工具
安裝
npm install mongoose
使用
var mongoose = require('mongoose'); // 引入 mongoose
mongoose.connect('mongodb://localhost/test'); // 通過 mongoose 連線 mongodb 資料庫
連線資料庫的預設埠為 27017
在 .connect
中返回一個狀態待定(pending)的連線, 可供我們對連線成功與否進行監測
var db = mongoose.connection; // 資料庫連線狀態
db.on('error', console.error.bind(console, 'connection error:')); // 資料庫連線失敗
db.once('open', function() {
// we're connected!(資料庫連線成功)
});
.on
的第一個引數可選值為 connected
、 error
、 disconnected
,分別用於監測 連線成功、連結異常、連結斷開
建立模型,設計資料庫
var kittySchema = mongoose.Schema({
name: String,
// 也可以如下寫法
name: {
type: String, // 資料型別
required: Boolean, // 是否為必須
defaule: '張三', // 預設值
enum: ['張三', '李四', '王五', '趙六'] // 列舉,預設值只可是列舉值
}
}
});
var Kitten = mongoose.model('Kitten', kittySchema);
mongoose.model
用於將一個資料庫模型釋出為 model
以上程式碼中,相當於建立了一個名為 Kitten
的集合,該集合內部的資料結構中有一條資料名為 name
,且是 字串
型別
使用 Kitten
以下程式碼創造一條資料
var felyne = new Kitten({ name: 'Felyne' });
此時,集合 Kitten
中會增加一條 name
為 Felyne
的資料,Felyne
的資料型別為 String
通過 .save
方法可以驗證資料是否儲存成功
fluffy.save(function (err, fluffy) {
if (err) return console.error(err);
fluffy.speak();
});
注意 回撥函式的第一個引數永遠是 error
-
增加資料
Model.save([fn])
var user = new User({ username: 'kongzhi0707', password: '123456' }); user.save(function(err, res) { if (err) { return console.log(err); } console.log(res); });
-
刪除資料
-
從集合中刪除所有符合條件的文件:Model.remove(conditions, [callback])
conditions:Object
[callback]:Function
示例:
var wherestr = {'username': 'kongzhi0707'}; // 刪除資料的條件 User.remove(wherestr, function(err, res) { if (err) { return console.log(err); } console.log(res); });
-
查詢匹配符合 id 的文件,將其刪除:Model.findByIdAndRemove(id, [options], [callback])
id:Object|Number|String
[options]:Object
sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件
select:設定要返回的文件欄位
rawResult:如果為 true ,則返回 MongoDB 驅動程式的原始結果
strict:覆蓋此更新的架構的嚴格模式選項
[callback]:Function
示例:
User.findByIdAndRemove(id, options, callback) // executes User.findByIdAndRemove(id, options) // return Query User.findByIdAndRemove(id, callback) // executes User.findByIdAndRemove(id) // returns Query User.findByIdAndRemove() // returns Query
-
根據記錄 :Model.findOneAndRemove(conditions, [options], [callback])
conditions:Object
[options]:Object
sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件
maxTimeMS:對查詢設定時間限制
select:設定要返回的文件欄位
rawResult:如果為 true ,則返回 MongoDB 驅動程式的原始結果
strict:覆蓋此更新的架構的嚴格模式選項
[callback]:Function
示例:
User.findOneAndRemove(conditions, options, callback) // executes User.findOneAndRemove(conditions, options) // return Query User.findOneAndRemove(conditions, callback) // executes User.findOneAndRemove(conditions) // returns Query User.findOneAndRemove() // returns Query
-
-
更新資料
-
根據條件更新資料庫中的一個文件:Model.update(conditions, doc, [options], [callback])
conditions:Object
doc:Object
[options]:Object
safe:(布林值)安全模式(預設為在架構(true)中設定的值)
upsert:(布林值)是否建立不匹配的文件(假)
multi:(布林值)是否應更新多個文件(假)
runValidators:如果為 true ,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作
setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅在MongoDB >= 2.4上有效)
strict:(布林值)會覆蓋此更新的嚴格選項
overwrite:(布林值)禁用僅更新模式,從而允許您覆蓋文件(false)
[callback]:Function
示例:
var wherestr = {'username': 'kongzhi0707'}; // 更新資料的條件查詢 var updatestr = {'password': 'abcdef'}; // 執行更新資料 User.update(wherestr, updatestr, function(err, res) { if (err) { return console.log(err); } console.log(res); });
-
通過文件的
_id
欄位更新資料庫中的一個文件 :Model.findByIdAndUpdate(id, [update], [options], [callback])id:Object|Number|String
[update]:Object
[options]:Object
new:bool-true,返回修改後的文件而不是原始文件(預設為 false )
upsert:bool-建立物件(如果不存在)(預設為false)
runValidators:如果為true,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作
setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅在MongoDB >= 2.4上有效)
sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件
select:設定要返回的文件欄位
rawResult:如果為true,則返回MongoDB驅動程式的原始結果
strict:覆蓋此更新的架構的嚴格模式選項
[options.lean]:Object
[callback]:Function
示例:
User.findByIdAndUpdate(id, update, options, callback) // executes User.findByIdAndUpdate(id, update, options) // returns Query User.findByIdAndUpdate(id, update, callback) // executes User.findByIdAndUpdate(id, update) // returns Query User.findByIdAndUpdate() // returns Query
-
根據記錄:Model.findOneAndUpdate([conditions], [update], [options], [callback])
[conditions]:Object
[update]:Object
[options]:Object
new:bool-如果為true,則返回修改後的文件而不是原始文件(預設為false)
upsert:bool-建立物件(如果不存在)(預設為false)
fields:{Object | String} 等效於 .select(fields).findOneAndUpdate()
maxTimeMS:對查詢設定時間限制-需要 mongodb >= 2.6.0
sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件
runValidators:如果為 true ,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作
setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅適用於MongoDB >= 2.4)
rawResult:如果為true,則返回MongoDB驅動程式的原始結果
strict:覆蓋此更新的架構的嚴格模式選項
[options.lean]:Object
[callback]:Function
示例:
User.findOneAndUpdate(conditions, update, options, callback) // executes User.findOneAndUpdate(conditions, update, options) // returns Query User.findOneAndUpdate(conditions, update, callback) // executes User.findOneAndUpdate(conditions, update) // returns Query User.findOneAndUpdate() // returns Query
-
-
查詢資料
-
根據條件查詢檔案:Model.find(conditions, [fields], [options], [callback]);
conditions:Object
[projection]:Object
[options]:Object
[callback]:Function
示例:
var wherestr = {'userName': '龍恩0707'}; // 刪除資料的條件 User.find(wherestr, function(err, res) { if (err) { return console.log(err); } console.log(res); });
-
通過其
_id
欄位查詢單個文件:Model.findById(id, [projection], [options], [callback])id:Object|String|Number
[projection]:Object
[options]:Object
[callback]:Function
示例:
Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately Adventure.findById(id).exec(callback); // same as above Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length Adventure.findById(id, 'name length').exec(callback); // same as above Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length` Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean` Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
-
根據記錄:Model.findOne([conditions], [projection], [options], [callback])
id:Object|String|Number
[projection]:Object
[options]:Object
[callback]:Function
示例:
Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately Adventure.findById(id).exec(callback); // same as above Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length Adventure.findById(id, 'name length').exec(callback); // same as above Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length` Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean` Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
-
範圍查詢:
User.find({userage: {gte: 21,lte: 65}}, callback); //這表示查詢年齡大於等21而且小於等於65歲
可用的部分類似範圍查詢條件還有:
o r ∗ ∗ : 或 關 系 ∗ ∗ or**:或關係 ** or∗∗:或關系∗∗nor:或關係取反 g t ∗ ∗ : 大 於 ∗ ∗ gt**:大於 ** gt∗∗:大於∗∗gte:大於等於
l t ∗ ∗ : 小 於 ∗ ∗ lt**: 小於 ** lt∗∗:小於∗∗lte:小於等於 n e ∗ ∗ : 不 等 於 ∗ ∗ ne**:不等於 ** ne∗∗:不等於∗∗in:在多個值範圍內
n i n ∗ ∗ : 不 在 多 個 值 範 圍 內 ∗ ∗ nin**:不在多個值範圍內 ** nin∗∗:不在多個值範圍內∗∗all:匹配陣列中多個值 $regex:正則,用於模糊查詢
s i z e ∗ ∗ : 匹 配 數 組 大 小 ∗ ∗ size**:匹配陣列大小 ** size∗∗:匹配數組大小∗∗maxDistance:範圍查詢,距離(基於LBS)
m o d ∗ ∗ : 取 模 運 算 ∗ ∗ mod**:取模運算 ** mod∗∗:取模運算∗∗near:鄰域查詢,查詢附近的位置(基於LBS)
e x i s t s ∗ ∗ : 字 段 是 否 存 在 ∗ ∗ exists**:欄位是否存在 ** exists∗∗:字段是否存在∗∗elemMatch:匹配內陣列內的元素
w i t h i n ∗ ∗ : 範 圍 查 詢 ( 基 於 L B S ) ∗ ∗ within**:範圍查詢(基於LBS) ** within∗∗:範圍查詢(基於LBS)∗∗box:範圍查詢,矩形範圍(基於LBS)
c e n t e r ∗ ∗ : 範 圍 醒 詢 , 圓 形 範 圍 ( 基 於 L B S ) ∗ ∗ center**:範圍醒詢,圓形範圍(基於LBS) ** center∗∗:範圍醒詢,圓形範圍(基於LBS)∗∗centerSphere:範圍查詢,球形範圍(基於LBS)
$slice:查詢欄位集合中的元素(比如從第幾個之後,第N到第M個元素)
-
資料參考:
相關文章
- MongoDB學習筆記MongoDB筆記
- MongoDB 學習筆記MongoDB筆記
- Node.js學習之路23——Node.js利用mongoose連線mongodb資料庫Node.jsMongoDB資料庫
- 【MongoDB學習筆記】MongoDB 快速入門MongoDB筆記
- node fs學習筆記筆記
- node.js和MongoDB學習網址Node.jsMongoDB
- 【MongoDB學習筆記】MongoDB索引那點事MongoDB筆記索引
- node基礎學習筆記筆記
- Node中Buffer學習筆記筆記
- node學習筆記之39筆記
- 在node中的mongodb及mongoose常見用法MongoDB
- 在node環境下使用Mongoose來操作MongoDBMongoDB
- 基於docker 初學 MongoDb 學習筆記DockerMongoDB筆記
- Node.js學習筆記(一)Node.js筆記
- Node.js學習筆記1Node.js筆記
- <node.js學習筆記(1)>Node.js筆記
- <node.js學習筆記(2)>Node.js筆記
- node事件迴圈學習筆記事件筆記
- mongodb和nodejs mongoose使用詳解MongoDBNodeJS
- 【MongoDB學習筆記】-使用 MongoDB 進行 CRUD 操作(下)MongoDB筆記
- 【MongoDB學習筆記】-使用 MongoDB 進行 CRUD 操作(上)MongoDB筆記
- <node.js學習筆記(完)>pug,mongodb命令(之後是node的案例,一個部落格)Node.js筆記MongoDB
- MongoDB 學習筆記之常用 shell 命令MongoDB筆記
- <node.js學習筆記(4)>stream和http模組Node.js筆記HTTP
- 【MongoDB學習筆記】手把手教你配置Python操作MongoDBMongoDB筆記Python
- node 學習筆記 基礎入門筆記
- Mongoose初步學習Go
- Node.js stream(流) 學習筆記(一)Node.js筆記
- Node.js學習筆記----day04Node.js筆記
- web前端培訓分享node學習筆記Web前端筆記
- <node.js學習筆記(5)>koa框架和簡單爬蟲練習Node.js筆記框架爬蟲
- Node.js 學習筆記_20170924(持續更新…)Node.js筆記
- node學習筆記第八節:模組化筆記
- <node.js學習筆記(3)>url,fs,qs,cryptoNode.js筆記
- 【Prometheus學習筆記】主機監控 -node_exporterPrometheus筆記Export
- node 使用 monk 工具操作 mongodb 資料庫學習MongoDB資料庫
- systemtap和火焰圖學習筆記筆記
- Git和Maven的學習筆記GitMaven筆記