数据库

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

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

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

分类:

  • 关系型数据库: 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. C++回顾day03---<纯虚函数和抽象类以及虚析构函数,delete使用>

    一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列 ...

  2. Cygwin添加到鼠标右键

    From:http://www.cnblogs.com/killerlegend/p/3960112.html 在cygwin中安装chere 管理员权限执行mintty,输入下列命令即可. cher ...

  3. SCI,EI,ISTP

    SCI:   Science Citation Index EI:     The Engineering Index ISTP:  Index to Scientific & Technic ...

  4. 常见的游戏AI技术对比(FSM,HFSM,BT,GOAP,HTN,Utilitay,机器学习)

    最近研究的内容,比较懒还没写文章,先占个坑,过几天补

  5. frame的用法

    <iframe> 标签规定一个内联框架.一个内联框架被用来在当前 HTML 文档中嵌入另一个文档. 所有的主流浏览器都支持<iframe>标签.你可以把提示的文字放到 < ...

  6. 解压unzip的用法

    1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...

  7. Django之restframework

    启动流程:引入rest_framework APP 在restframework中,GET数据可以通过request.query_params.get(xxx)获取,post数据可以通过request ...

  8. ModuleNotFoundError: No module named 'video_back.urls'

    新建Django项目时将settings,urls移除来时报错. 这是我所想要的项目结构  >>>  扁平结构. 将下面这个应用的名字删掉就可以了.

  9. oracle用命令创建表空间、用户,并为用户授权、收回权限。

    oracle中如何删除用户? Oracle中使用DROP USER来删除用户,如果使用DROP USER CASCADE那么用户的对象也同时被删除掉.为了达到删除用户的效果而又不影响对用户下的对象的使 ...

  10. 038_nginx backlog配置

    一. backlog=number sets the backlog parameter in the listen() call that limits the maximum length for ...