数据库

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

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

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

分类:

  • 关系型数据库: 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; 

MongoDB_简介_安装_基本使用_js_mongoose 操作 MongoDB 编程的更多相关文章

  1. C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节

    C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...

  2. 四、linux基础-系统目录_安装_相关命令_调度

    4 系统目录-安装-版本4.1系统目录Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录. 在装完Linux系统以后会自动生成一下等目录, ...

  3. Nutch搜索引擎(第2期)_ Solr简介及安装

    1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化 ...

  4. Cloudera Manager安装_搭建CDH集群

    2017年2月22日, 星期三 Cloudera Manager安装_搭建CDH集群 cpu   内存16G 内存12G 内存8G 默认单核单线 CDH1_node9 Server  || Agent ...

  5. OCM_第十六天课程:Section7 —》GI 及 ASM 安装配置 _安装 GRID 软件/创建和管理 ASM 磁盘组/创建和管理 ASM 实例

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  6. 【XPath Helper:chrome爬虫网页解析工具 Chrome插件】XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插件网

    [XPath Helper:chrome爬虫网页解析工具 Chrome插件]XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插 ...

  7. MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64、MySQL5.7)

    MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64.MySQL5.7) 安装包版本 1)     VMawre-workstation版本包 地址: https://m ...

  8. Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)

    Windows基础环境_安装配置教程(Windows7 64.JDK1.8.Android SDK23.0.TortoiseSVN 1.9.5) 安装包版本 1)     JDK版本包 地址: htt ...

  9. Linux基础环境_安装配置教程(CentOS7.2 64、JDK1.8、Tomcat8)

    Linux基础环境_安装配置教程 (CentOS7.2 64.JDK1.8.Tomcat8) 安装包版本 1)     VMawre-workstation版本包 地址: https://my.vmw ...

随机推荐

  1. 浏览器UI多线程及JavaScript单线程运行机制的理解

    在上一篇博客中,我对jQuery的队列(queue)机制和动画(animate)机制做了一个深入的解析,在animate的实现机制其核心是依靠queue来完成的,其中在jQuery的链式调用部分,之前 ...

  2. ArcGis安装失败提示“需要Microsoft .NET Framework 3.5 sp1或等效环境”的解决方法

    这个问题一般出现在Win8或者Win10系统上,因为系统默认没有启用该.Net Framework. 下载Microsoft .NET Framework 3.5 sp1安装后再开始安装ArcGis. ...

  3. css选择器(常规选择器,伪类选择器,伪元素选择器,根元素选择器)

    前言 CSS的一个核心特性是能向文档中的一组元素类型应用某些规则,本文将详细介绍CSS选择器 选择器 [通配选择器] 星号*代表通配选择器,可以与任何元素匹配 *{color: red;} [元素选择 ...

  4. LINQ to SQL 调用 SQL Server 的系统函数

    Ø  简介 在 C# 中比较常用的 ORM(Object Relational Mapping)框架就是 EF 了,EF 经常结合 LINQ to SQL 来操作数据库.本文主要讨论如何在 LINQ ...

  5. Xvector in Kaldi nnet3

    Xvector nnet Training of Xvector nnet Xvector nnet in Kaldi     Statistics Extraction Layer in Kaldi ...

  6. UDP核心API讲解

  7. java PDF2JPG

    import org.apache.commons.lang3.StringUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org ...

  8. python中的Iterable对象和Iterator

    参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254 ...

  9. css布局中的百分比布局

    1.在说到百分比是前,先简单了解下基本的单位 英寸(inch) :in 1 in=2.54cm厘米(centimeter):cm毫米(millimeter):mm磅(point):pt 1pt=1/7 ...

  10. Innodb和Myisam数据恢复

    (转自)https://www.cnblogs.com/DwyaneTalk/p/4113829.html 背景 这次恢复oracle和sqlserver,想想也不能把mysql落下了吧.三剑合一.都 ...