數據庫html
按照數據結構來組織、存儲和管理數據的倉庫mongodb
程序運行時,數據存儲於內存中,一旦程序結束或者斷電,就會數據丟失數據庫
爲了將有些數據持久化存儲到硬盤中,並確保可操做性和安全性,就須要數據庫npm
分類:編程
特色: 基於數據間的聯繫進行存儲數組
特色: 關係不緊密,有文檔,有鍵值對promise
1. MongoDB安全
MongoDB 是快速開發互聯網 Web 應用而設計的數據庫系統數據結構
設計目標: 極簡,靈活、做爲 Web 應用棧的一部分app
MongoDB 模型是面向文檔的,所謂的文檔是一種相似 JSON 的結構——BSON
安裝軟件之後:
1. 建立 倆文件夾
C:\data\db
C:\data\log
// MongoDB的默認端口號 27017
a.能夠經過 --port 來指定端口號
b.端口號儘可能使用四位以上,不要超過最大端口號65535
c.不能使用其餘服務佔用的端口號
// MongoDB數據庫默認會存放在C盤根目錄下的data/db
a.能夠經過 --dbpath 指令來指定數據庫的目錄
// mongod --dbpath C:\workplace\databases --port 12345
2. 配置系統自啓動服務
以管理員身份運行 cmd 並輸入如下命令
sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\4.0\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
右擊 個人電腦 管理 服務 找到 MongoDB 右鍵 啓動服務
3. 打開可視化操做客戶端 Stdio 3T for MongoDB
鏈接數據庫,點擊 loacl ----> intelliSheel
show databases; // 顯示全部數據庫
use testDB; // 建立 並將當期數據庫指定爲 testDB,若是不存在,則建立
db; // 顯示當前數據庫
db.dropDatabase(); // 刪除當前數據庫
// 當前數據庫 db ----> testDB
db.createCollection("students"); // 建立一個集合
// 在 MongoDB 中,你不須要建立集合。當你插入一些文檔時,MongoDB 會自動建立集合
show collections; // 顯示 當前數據庫的全部 集合
db.students.drop(); // 刪除 名爲 students 的集合
db.students.insert({"name":'RyenToretto', "age": 22}); // 插入一條文檔 根據()_id 自動生成的惟一的
// 也能夠將數據定義爲一個變量,再插入
newInfo = ({"name":'RyenToretto', "age": 22});
db.students.insert(newInfo);
db.students.remove({"name":'DD'}); // 刪除全部符合條件的文檔
db.students.remove({"name":'DD'}, 1); // 刪除第 1 個符合條件的文檔
db.students.remove({"age":18}); // 刪除全部文檔
db.students.find(); // 查找全部文檔
db.students.find({"age":18}); // 查找 {"age":18} 的文檔
db.students.find({$or:[{"age":18}, {"age":22}]}); // 查找 {"age":18} 或者 {"age":22} 的文檔
db.students.find({ "age":{$gt:18}, "age":{$lt:30} }); // 查找 "age":{$gt:18} and "age":{$lt:30} 的文檔
// 查找 name 爲 string 類型 的文檔
db.students.find({ "name":{$type:2} });
db.students.find({ "name":{$type:'string'} });
db.students.find({ "name":{$type:'string'} }).limit(1); // 只顯示 1 條 結果
db.students.find({ "name":{$type:'string'} }).skip(1); // 跳過 前 1 條 結果
db.students.find({ "name":{$type:'string'} }).sort({"age":1}); // 以 字段 "age" 升序排列結果
db.students.find({ "name":{$type:'string'} }).sort({"age":-1}); // 以 字段 "age" 降序排列結果
db.collection.update(查詢條件,新的文檔,配置對象) // 修改或替換一個或多個文檔
db.students.update({"age":22}, {$set:{"age":18}}); // 只會修改第一條發現的文檔
db.students.update({"age":22}, {$set:{"age":18}}, {multi:true}); // 修改全部符合條件的文檔
2. Mongoose 模塊 操做 MongoDB 數據庫
是一個對象文檔模型(ODM)庫,
它對 Node 原生的 MongoDB 模塊進行了進一步的優化封裝,並提供了更多的功能
特色:
1) 能夠爲文檔建立一個模式結構(Schema)
2) 能夠對模型中的對象/文檔進行驗證
3) 數據能夠經過類型轉換轉換爲對象模型
4) 可使用中間件來應用業務邏輯掛鉤
5) 比 Node 原生的 MongoDB 驅動更容易
Schema
模式對象: 能夠理解爲 表的各個字段的描述,能夠進行 表的字段 的具體配置與約束
Model
模型對象: 能夠理解爲 表 table
Model.createMany(); // 建立 一個或者多個文檔,並添加到數據庫中
Model.remove(); // 刪除 一個或者多個文檔
Model.find(); // 查找符合條件的文檔
Model.updateMany(); // 修改符合條件的 一個或者多個文檔
Document
文檔對象: 能夠理解爲表中的一條記錄
Document.save(); // 保存文檔
Document.isNew(); // 判斷是不是新的文檔
Document.id; // 獲取文檔的 id 屬性
Document.toObject(); // 轉換爲一個普通的數組
name: first_mongoose
而後一路回車就好了
// 1. 引入 moogose 模塊
const mg = require('mongoose');
// 2. 鏈接本地數據庫
mg.connect('mongodb://localhost:27017/mongoose_test', {useNewUrlParser: true});
// 3. 綁定監聽事件
mg.connection.on('open', err => { if(err){ console.log(err); }else{ console.log('數據庫鏈接成功'); }; });
// 4. 獲取 schema 對象、model 對象、建立 document 對象
// ① 獲取 Schema 模式類
const Schema = mg.Schema; // ② 實例約束對象 const studentsSchema = new Schema({ name: String, // 要求集合中的文檔的 name 字段 的值類型爲 String age: Number, sex: { type: String, // 類型爲 String default: '男' // 設置默認值 }, hobby: [String], // 值是數組,數組中的元素爲 String phone: { type: String, unique: true // 設置 惟一 }, createTime: { type: Date, default: Date.now } }); // ③ 獲取 model 模型類(集合名稱 複數) const Students = mg.model('students', studentsSchema); // ④ 實例一個 文檔對象 const stu1 = new Students({ name: 'Ryen', age: 20, hobby: ['rose'], phone: '18273727777' }); // ⑤ 保存數據 s1.save();
// 5. 右鍵運行,就能夠發現 新建了一個數據庫 mongoose_test,並有了相關內容
注意:
以上這種運行方式,是最基本的方式,可是是不安全的
由於 全部數據庫 操做都應該鏈接成功 mg.connect 之後才能進行
因此,正確打開方式:利用 Promise((resolve, reject)=>{}) 來包裹執行
/**** 1. 引入 moogose 模塊 ****/ const mg = require('mongoose'); const promiseDB = new Promise((resolve, reject)=>{ /**** 2. 鏈接本地數據庫 ****/ console.log("\n\n\n\n---- start ----"); mg.connect('mongodb://localhost:27017/mongoose_test', {useNewUrlParser: true}); /**** 3. 綁定監聽事件 ****/ mg.connection.on('open', err => { if(err){ reject(err); }else{ resolve('數據庫鏈接成功'); }; }); }); promiseDB .then(async result=>{ /**** 4. 獲取 schema 對象、model 對象、建立 document 對象 ****/ // ① 獲取 Schema 模式類 const Schema = mg.Schema; // ② 實例約束對象 const studentsSchema = new Schema({ name: String, // 要求集合中的文檔的 name 字段 的值類型爲 String age: Number, sex: { type: String, // 類型爲 String default: '男' // 設置默認值 }, hobby: [String], // 值是數組,數組中的元素爲 String phone: { type: String, unique: true // 設置 惟一 }, createTime: { type: Date, default: Date.now } }); // ③ 獲取 model 模型類(集合名稱 複數) const Students = mg.model('students', studentsSchema); /************** new Students().save 方式添加數據 ***************/ // ④ 實例一個 文檔對象 // const stu = new Students({ // name: 'Ryen', // age: 22, // hobby: ['Rose'], // phone: '18273727777' // }); // // // ⑤ 保存數據 // stu.save(); /************** Model.create(文檔對象, 回調函數) ***************/ // Students.create({ // name: 'Tom', // age: 20, // hobby: ['Jerry'], // phone: 18877556455 // }, err=>{ // console.log(err?err:('---->create 成功了!')); // }); /************** Model.create(文檔對象) 返回 Promise 對象 *******/ // await Students.create({ // name: 'Jerry', // age: 21, // hobby: ['Tom'], // phone: 18877226455 // }); /**** Model.insertMany(文檔對象1, 文檔對象1, 回調函數) *********/ // const infos = [{ // name: 'Jack', // age: 18, // hobby: ['Rose'], // phone: 18877336455 // },{ // name: 'Rose', // age: 17, // hobby: ['Jack'], // phone: 18877446455 // } // ]; // // Students.insertMany(infos, err=>console.log(err?err:('---->create 成功了!'))); /****************************************************************/ /**** Model.deleteOne *******************/ // const ret = await Students.deleteOne({"sex": '女'}); // console.log(ret); // console.log('----------------------- ret -------------------------'); /****************************************************************/ /**** Model.updateOne *******************/ // $inc 在原有的數值上 增長某個值 // const reta = await Students.updateOne({"age": {$gte:18}}, {$inc: {"age":1} }); // console.log(reta); // console.log('----------------------- reta -------------------------'); // // const retb = await Students.updateMany({}, {"sex": '女'}); // console.log(retb); // console.log('----------------------- retb -------------------------'); // const all = await Students.find({}); // console.log(all); /****************************************************************/ /**** Model.find(查詢條件[, 投影], 回調函數) *******************/ const ret1 = await Students.find({"name":'Tom', "age":22}); // 返回一個數組 console.log(ret1); console.log('----------------------- ret1 -------------------------'); const ret2 = await Students.find({"age": {$gte:22} }); // $gte 大於等於 console.log(ret2); console.log('----------------------- ret2 -------------------------'); const ret3 = await Students.findOne({"age": {$lte:22} }); // $lte 小於等於 ret3.age += 1; await ret3.save(); // 是一個 Promise 對象 console.log(ret3); console.log('----------------------- ret3 -------------------------'); const ret4 = await Students.find({"age": {$in:[18, 22]} }); // $in 或者 值 console.log(ret4); console.log('----------------------- ret4 -------------------------'); // $or 或者 條件 const ret5 = await Students.find({$or: [{"age": {$gte:22} }, {"age": {$lte:18}} ]}); console.log(ret5); console.log('----------------------- ret5 -------------------------'); const ret6 = await Students.find({"age": {$gte:18} }, {__v: 0, phone: 0}); // __v 投影 console.log(ret6); console.log('----------------------- ret6 -------------------------'); /****************************************************************/ }) .catch(err=>{ console.log(err); });
模塊化編程:
1. 新建文件夾
class_info
class_info/db
class_info/module
2. npm init;
"name": class_info
3. npm install mongoose;
主模塊:
const promiseConnect = require('./db/connectDB.js'); promiseConnect.then(async result=>{ console.log('\n\n\n'+result); const studentsModel = require('./module/students.js'); infoJack = [{ "name": 'Jack', "sex": '男', "age": 17, },{ "name": 'Rose', "sex": '女', "age": 16, }]; infoTom = [{ "name": 'Tom', "sex": '男', "age": 21, },{ "name": 'Jerry', "sex": '女', "age": 18, }]; // console.log('------------------增長------------------'); // const insertRet = await studentsModel.insertMany( // [...infoJack, ...infoTom], // err=>console.log(err?err:('---->create 成功了!')) // ); // console.log(insertRet); // console.log('------------------刪除------------------'); // const deleteRet = await studentsModel.deleteMany({"age": {$gt:18}}); // console.log(deleteRet); // console.log('------------------修改------------------'); // const updateRet = await studentsModel.updateMany({"age":{$lt:30}}, {$inc:{"age":1}}); // console.log(updateRet); console.log('------------------查找------------------'); const findRet = await studentsModel.find({}); findRet.forEach(async ele=>{ ele.age -= 1; if(ele.age <= 15){ ele.age = 18; }; await ele.save(); }); console.log(findRet); }).catch(err=>console.log(err));
功能模塊:
const mongoose = require('mongoose'); const promiseConnect = new Promise((resolve, reject)=>{ mongoose.connect('mongodb://localhost:27017/class_database', {useNewUrlParser:true}) mongoose.connection.once('open', err=>{ if(err){ console.log(err); reject(err); }else{ resolve('數據庫鏈接成功!'); }; }); }); module.exports = promiseConnect;
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const studentsSchema = new Schema({ "name": { "type": String, "unique": true }, "sex": { "type": String, "default": "男" }, "age": { "type": Number, "default":18 }, "createTime": { "type": Date, "default": Date.now() } }); const studentsModel = mongoose.model("students_info", studentsSchema); module.exports = studentsModel;