MongoDB_简介_安装_基本使用_js_mongoose 操作 MongoDB 编程

数据库

按照数据结构来组织、存储和管理数据的仓库

程序运行时,数据存储于内存中,一旦程序结束或者断电,就会数据丢失

为了将有些数据持久化存储到硬盘中,并确保可操作性和安全性,就需要数据库

分类:

  • 关系型数据库: MySQL、Oracle、DB2、SQL server

特点: 基于数据间的联系进行存储

  • 非关系型数据库: MongoDB、Redis

特点: 关系不紧密,有文档,有键值对

1. MongoDB

MongoDB 是快速开发互联网 Web 应用而设计的数据库系统

设计目标: 极简,灵活、作为 Web 应用栈的一部分

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; 

 

posted @ 2018-12-19 11:16  耶梦加德  阅读(283)  评论(0编辑  收藏  举报