一、MongoDB

1.1概述

  1. MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

  2. 关系型数据库和非关系型数据库

    • 关系型数据库:表与表之间存在关系

      • 所有的关系型数据可以都需要通过sql语言来操作

      • 所有的关系型数据库在操作之前都需要设计表结构

      • 所有关系型数据库支持约束:

        • 唯一的

        • 主键

        • 默认值

        • 非空

    • 非关系型数据库

      • 有的非关系型数据库就是key-value对儿,没有表

      • MongoDB是长得最像关系型数据库的非关系型数据库

        • 数据库->数据库

        • 数据表->集合(数组)

        • 表记录->文档对象

      • MongoDB不需要设计表结构,也就是说可以任意往里面存储数据,没有结构性这么一说

  3. MongoDB数据库的基本概念

    • 数据库——mongodb下可以有多个数据库

    • 集合——一个数据库可以有多个集合(相当于MySQL中的表)

    • 文档——一个集合可以有多个文档(相当于MySQL中的表记录)

  4. MongoDB的存储结构:
    {
    //数据库
    qq:{
    //集合
    users:[
    //文档
    {name:"张三",age:},
    {name:"李四",age:},
    {name:"王麻子",age:},
    {name:"刘老五",age:},
    {name:"赵老六",age:}
    ......
    ],
    products:[ ]
    ......
    },
    taobao:{ },
    baidu:{ }
    ......
    }

注意:

    • 文档结构很灵活,没有任何限制
    • MongoDB非常灵活,不需要像MySQL一样先创建数据库、表、设计表结构。当你需要插入数据的时候,只需要指定往哪个数据库的哪个集合操作就可以了。一切都由MongoDB来帮你自动完成建库建集合这件事儿 

1.2安装

64位下载地址:https://www.mongodb.com/download-center/community

注意:

  • 记得要配置环境变量

  • 输入  mongod --version 测试是否安装成功

1.3启动和关闭mongodb 数据库

  • 启动:

    mongod --dbpath = 数据存储目录路径

    注意:

    • MongoDB将数据目录存储在 db 目录下,但是这个数据目录不会主动创建。我们第一次启动mongodb时,需要手动在根目录下创建data\db这个目录。这里要注意,数据目录应该放在根目录下(如:C:\或者 D:\ 等, 比如我的是放在C:\data\db下)

    • 第一次启动mongodb时,执行命令:mongod --dbpath "C:\data\db",后面再启动mongodb时,直接执行命令:mongod即可

    • mongod --dbpath 命令是创建数据库文件的存放位置,第一次启动mongodb服务时需要先确定数据库文件存放的位置,否则系统不会自动创建,启动会不成功。

  • 停止:

    在开启服务的控制台,直接Ctrl+C即可停止
    或者直接关闭开启服务的控制台也可以   

1.4连接和退出mongodb数据库

连接:

#该命令默认连接本机的 MongoDB 服务
mongo

退出:

#在连接状态输入 exit 退出连接
exit

1.5基本命令

  • show dbs:查看显示所欲数据库

  • db:查看当前操作的数据库

  • use 数据库名称:切换到指定的数据库(如果没有会新建)

  • 如下:

  

1.6在Node中如何操作MongoDB数据库

1.6.1使用官方的MongoDB包来操作

下载地址:https://github.com/mongodb/node-mongodb-native

1.6.2使用第三方mongoose来操作MongoDB数据库

第三方包mongoose:基于MongoDB官方的mongodb包再一次做了封装

官网:https://mongoosejs.com/

官方指南:https://mongoosejs.com/docs/guides.html

官方API文档:https://mongoosejs.com/docs/api.html

  1. 起步

    • 安装:

      npm i mongoose
    • 实例demo:

      // 官方参考模板
      const mongoose = require('mongoose'); // 连接 MongoDB数据库
      mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true}); // 创建一个模型,就是在设计数据库
      // MongoDB是动态的,非常灵活,只需要在代码中设计数据库就可以了
      // mongoose这个包就可以让你的设计编写过程变得非常的简单
      const Cat = mongoose.model('Cat', { name: String });//虽然这里的Cat是大写,但是会生成小写的 cats 集合名称 //实例化一个Cat
      const kitty = new Cat({ name: 'Zildjian' }); // 持久化保存 Kitty 实例
      kitty.save().then(() => console.log('meow'));
  2. 官方指南

    • 设计 Schema 发布 Model

      var mongoose = require('mongoose')
      
      var Schema = mongoose.Schema
      
      // 1.连接数据库
      // 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
      mongoose.connect('mongodb://localhost/test') // 2.设计集合结构(表结构)
      // 字段名称就是表结构中的属性名称
      // 约束的目的是为了保证数据的完整性,不要有脏数据
      var userSchema = new Schema({
      username:{
      type:String,
      required:true //表示username必须要有
      },
      password:{
      type:String,
      required:true
      },
      email:{
      type:String
      } }); //3.将集合结构发布为模型
      // mongoose.model 方法就是用来将一个架构发布为一个 model
      // 第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
      // mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称。例如这里的 User 最终会变成 users 集合名称
      // 第二个参数:架构 Schema
      // 返回值:模型构造函数
      var User = mongoose.model('User', userSchema) // 4.当有了模型构造函数之后,就可以使用这个构造函数对 users 集合中的数据为所欲为了(增删改查)
    • 增加数据

      var admin = new User({
      username:"admin",
      password:"123456",
      email:"admin@admin.com"
      }) admin.save(function(err,ret){
      if(err){
      console.log("保存失败")
      }else{
      console.log("保存成功")
      console.log(ret)
      }
      })
    • 查询

      • 查询所有

        User.find(function(err,ret){
        if(err){
        console.log("查询失败")
        }else{
        console.log(ret)
        }
        })
      • 按条件查询所有

        User.find({
        username:"zs" //这就是条件
        },function(err,ret){
        if(err){
        console.log("查询失败")
        }else{
        console.log(ret)
        }
        })
      • 按条件查询单个

        User.findOne({
        username:"zs" //这就是条件
        },function(err,ret){
        if(err){
        console.log("查询失败")
        }else{
        console.log(ret)
        }
        })
    • 删除数据

      • 删除所有符合条件的数据

        User.remove({
        username:"zs"
        },function(err,ret){
        if(err){
        console.log("删除失败")
        }else{
        console.log("删除成功")
        console.log(ret)
        }
        })
      • 删除符合条件的第一条数据

        User.deleteOne({
        username:"admin"
        }, function (err) {
        if (err){
        return handleError(err)
        }
        // deleted at most one User document
        })

        User.findOneAndRemove(conditions,[options],[callback])
      • 根据id删除一条数据

        User.findByIdAndRemove(id,[options],[callback])
    • 更新数据

      • 根据条件更新所有

        User.update(conditions,doc,[options],[callback])
      • 根据指定条件跟新一个

        User.findOneAndUpdate([conditions],[update],[options],[callback])
      • 根据id更新一个

        User.findByIdAndUpdate('5d32fa6bac0b39270c256225',{
        password:"123"
        },function(err,ret){
        if(err){
        console.log("更新失败")
        }else{
        console.log("更新成功")
        }
        })

二、MySQL

1.官方参考

https://www.npmjs.com/package/mysql

2.安装

npm install mysql

3.参考demo

var mysql      = require('mysql');

// 1.创建连接
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123',
database : 'students'
}); // 2.连接数据库
connection.connect(); // 3.执行数据操作
connection.query('SELECT * FROM `users`', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
}); // ---------所有的增删改查都在query方法里面操作--------------------------------------
// -------------增加数据-------------------------
// connection.query('INSERT INTO users VALUES(null,"admin","123456")', function (error, results, fields) {
// if (error) throw error;
// console.log('The solution is: ', results);
// }); // 4.关闭连接
connection.end();

注意:

  • 要提前安装好MySQL,并且打开MySQL服务
  • 对于MySQL,创建连接的数据库的表和字段需要提前设置好

Nodejs之路(四)—— MongoDB&MySQL的更多相关文章

  1. python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点

    python 闯关之路四(下)(并发编程与数据库编程)   并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型   操作系统工作原理介绍.线程.进程演化史.特点.区别 ...

  2. TODO:MongoDB MySQL数据库备份

    TODO:MongoDB MySQL数据库备份 1. MongoDB使用命令备份 mongodump进行整个数据库备份,主要用到的命令参数: -d 要备份的数据库 -o 输出的路径 ./mongodu ...

  3. 我的VSTO之路(四):深入介绍Word开发

    原文:我的VSTO之路(四):深入介绍Word开发 在上一篇文章中,我介绍了Word的对象模型和一些基本开发技巧.为了更好的介绍Word插件开发,我为本文制作了一个Word书签的增强版,具体功能是让用 ...

  4. 第四章 MySQL高级查询(二)

    第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...

  5. Python/MySQL(四、MySQL数据库操作)

    Python/MySQL(四.MySQL数据库操作) 一.数据库条件语句: case when id>9 then ture else false 二.三元运算: if(isnull(xx)0, ...

  6. 第四章 MySQL数据类型和运算符

    5.1 MySQL数据类型介绍 一.数据类型简介 (1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容 (2) 不同的数据类型也决定了 My ...

  7. redis mongodb mysql 三大数据库的更简单的批量操作。批量任务自动聚合器。

    1.redis mongodb mysql的python包都提供了批量插入操作,但需要自己在外部对一个例如1000 001个任务进行分解成每1000个为1个小批次,还要处理整除批次数量后的余数,如果做 ...

  8. centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课

    centos  LAMP第四部分mysql操作  忘记root密码  skip-innodb 配置慢查询日志 mysql常用操作  mysql常用操作 mysql备份与恢复   第二十二节课 mysq ...

  9. nodejs之路-[0]安装及简易配置

    题外话: 之前写过ubuntu下编译nodejs- 传送门:Ubuntu15.04编译安装nodejsV0.12.3 只是如今基本在win下做开发了-. 就以这篇帖子为开头,作为我踏上nodejs之路 ...

  10. nodejs取参四种方法req.body,req.params,req.param,req.body

    摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...

随机推荐

  1. bzoj3505: [Cqoi2014]数三角形 [数论][gcd]

    Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...

  2. Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法

    首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject  NewObject(jclass clazz  , jmethodI ...

  3. TopCoder[TCO2016 Round 1A]:EllysTree(1000)

    Problem Statement      Elly has a graph with N+1 vertices, conveniently numbered from 0 to N. The gr ...

  4. 线性dp(记忆化搜索)——cf953C(经典好题dag和dp结合)

    非常好的题!和spoj 的 Mobile Service有点相似,用记忆化搜索很容易解决 看了网上的题解,也是减掉一维,刚好可以开下数组 https://blog.lucien.ink/archive ...

  5. luoguP3281 [SCOI2013]数数

    传送门 抄的llj的代码 还有点问题没弄懂,先码着 //Achen #include<algorithm> #include<iostream> #include<cst ...

  6. hdu6110

    #include <cstdio> #include <iostream> #include <cmath> #include <cstring> #i ...

  7. APIHOOK

    #include <stdio.h> #include <windows.h> #include <Dbghelp.h> #pragma comment(lib,& ...

  8. 27. USART, Universal synchronous asynchronous receiver transmitter

    27.1 USART introduction 通用同步异步接收发射机(USART)对需要NRZ异步串行数据格式行业标准的外部设备,提供了一个灵活的全双工数据交换的方法.USART使用分数波特率生成器 ...

  9. 2019 IEEEXtreme 13.0 题解记录

    比赛时间 2019.10.19 8:00 - 2019.10.20 8:00 比赛网站 https://csacademy.com/ieeextreme13 // 连续24小时做题真的是极限体验 // ...

  10. 拾遗:Git 基础

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ 一.参数配置 $ git con ...