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


    数据库

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

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

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

    分类:

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

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

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

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

    1. MongoDB

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

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

    MongoDB 模型是面向文档的,所谓的文档是一种类似 JSON 的结构——BSON

    安装软件以后:

    1. 创建 俩文件夹

    C:datadb
    C:datalog

    // MongoDB的默认端口号 27017

    a.可以通过 --port 来指定端口号
    b.端口号尽量使用四位以上,不要超过最大端口号65535
    c.不能使用其他服务占用的端口号

    // MongoDB数据库默认会存放在C盘根目录下的data/db

    a.可以通过 --dbpath 指令来指定数据库的目录
    // mongod --dbpath C:workplacedatabases --port 12345

    2. 配置系统自启动服务

    以管理员身份运行 cmd 并输入以下命令

    • sc.exe create MongoDB binPath= ""C:Program FilesMongoDBServer4.0inmongod.exe" --service --config="C:Program FilesMongoDBServer4.0mongod.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("
      
      
      
      ---- 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('
      
      
      '+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; 

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    最小顶点覆盖,最大独立集,最小边覆盖
    Security Badges
    异常
    List和Set
    数据结构
    Collection集合
    Excel序号递增
    VM虚拟机桥接模式无法联网解决办法
    mybatis-Plus方法指定更新的字段
    maven项目 导出相关依赖包到指定文件夹
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/10142081.html
Copyright © 2020-2023  润新知