MongoDB_簡介_安裝_基本使用_js_mongoose 操做 MongoDB 編程

數據庫html

按照數據結構來組織、存儲和管理數據的倉庫mongodb

程序運行時,數據存儲於內存中,一旦程序結束或者斷電,就會數據丟失數據庫

爲了將有些數據持久化存儲到硬盤中,並確保可操做性和安全性,就須要數據庫npm

分類:編程

  • 關係型數據庫: MySQL、Oracle、DB二、SQL server

特色: 基於數據間的聯繫進行存儲數組

  • 非關係型數據庫: MongoDB、Redis

特色: 關係不緊密,有文檔,有鍵值對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

  • 數據庫 testDB

show databases;        // 顯示全部數據庫

use testDB;        // 建立 並將當期數據庫指定爲 testDB,若是不存在,則建立

db;        // 顯示當前數據庫

db.dropDatabase();        // 刪除當前數據庫

 

  • 集合 students

// 當前數據庫 db ----> testDB

db.createCollection("students");    // 建立一個集合

// 在 MongoDB 中,你不須要建立集合。當你插入一些文檔時,MongoDB 會自動建立集合

 

 

show collections;        // 顯示 當前數據庫的全部 集合

 

db.students.drop();        // 刪除 名爲 students 的集合

 

  • 文檔 {"name":'RyenToretto', "age": 22}

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();        // 轉換爲一個普通的數組

  • npm init

name: first_mongoose

而後一路回車就好了

  • npm install mongoose
  • mongoose.js

// 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();
  • 更多操做見 https://mongoosejs.com/docs/guide.html

// 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;

主模塊:

  • 6. 入口文件  class_info/(index.js 或者 app.js 或者 main.js)
  • 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));

功能模塊:

  • 4. 鏈接數據庫 class_info/db/connectDB.js
  • 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;
  • 5. 獲取表 class_info/module/students.js
  • 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; 

相關文章
相關標籤/搜索