zoukankan      html  css  js  c++  java
  • Node.js学习笔记----day05(MongonDB详情)

    认真学习,认真记录,每天都要有进步呀!!!
    加油叭!!!


    一、es6中的find() 方法的原理

    EcmaScript 6 对数组新增了很多方法
    比如,find

    find 接收一个方法作为参数,方法内部返回一个条件
    find 会遍历所有的元素,执行你给定的带有条件返回值的函数
    符合该条件的元素会作为 find 方法的返回值
    如果遍历结束还没有符合该条件的元素,则返回 undefined

    var users = [
      {id: 1, name: '张三'},
      {id: 2, name: '张三'},
      {id: 3, name: '张三'},
      {id: 4, name: '张三'}
    ]
    Array.prototype.myFind = function (conditionFunc) {
     //下面的函数调用相当于在这里声明了一个变量
      // var conditionFunc = function (item, index) { return item.id === 4 }
      for (var i = 0; i < this.length; i++) {
        if (conditionFunc(this[i], i)) {
          return this[i]
        }
      }
    }
    //this[i]相当于item 
    //i相当于index
    var ret = users.myFind(function (item, index) {
      return item.id === 1
    //返回一个布尔值,这是一个条件,每遍历一次,就会调用一次这个方法
    //如果其中遍历的某个元素在调用这个方法的过程返回true,那就要执行return this[i],那么就能马上得到myFind方法的返回值
    })
    
    console.log(ret)
    

    在这里插入图片描述

    二、MongonDB

    详细文档
    MongonDB官网

    1.关系型数据库与非关系型数据库(NoSQL)

    表就是关系,或者说表与表之间存在关系
    1.所有的关系型数据库都需要使用sql语言来操作
    2. 所有的关系型数据库操作之前都需要设计表结构
    3. 而且数据表还支持约束
    唯一的
    主键
    默认值
    非空
    4. 非关系型数据库非常的灵活
    5. 有的非关系型数据库就是键值对 key-value
    6. 但是MongoDB是长得最像关系型数据库的非关系型数据库
    数据库 -----> 数据库
    数据表 ----->集合(数组)
    表记录 -----> (文档对象)
    7. MongoDB不需要设计表结构,也就是说可以任意的在里面存数据,没有结构性这么一说

    2. MongoDB数据库的基本概念

    • 可以有多个数据库
    • 一个数据库中可以有多个集合(相当于mysql中的表)
    • 一个集合中可以有多个文档(相当于表记录)
    • 文档结构很灵活,没有任何限制
    • MongoDB很灵活,不用像MySQL那样先创建数据库,表,设计表结构,当你需要插入数据的时候,只需要指定往哪个数据库的哪个集合操作就可以了,一切都由MongoDB来自动完成建库建表
      在这里插入图片描述

    3.安装MongonDB

    MongoDB的官网下载链接:https://www.mongodb.com/try/download/community
    在官网上下载比较麻烦,推荐一个直接下载zip的地址:
    64位的安装地址:http://dl.mongodb.org/dl/win32/x86_64
    32位的安装地址:http://dl.mongodb.org/dl/win32/i386

    配置环境变量

    在这里插入图片描述
    查看版本信息

     $ mongod --version
    

    在这里插入图片描述

    4. 启动和关闭MongoDB数据库

    启动:

    # mongodb默认使用执行 mongod 命令所处的盘符根目录下的 /data/db作为自己的数据村春目录
    # 所以在第一次执行命令之前要先自己手动新建一个 / data/db
    # 如果是在C盘,那就在C盘根目录下创建,如果是在D盘,那就在D盘下创建
    mongod
    

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    创建好 /data/db目录后 再执行mongod

    说明mongodb已开启成功
    在这里插入图片描述

    如果想要修改默认的存储路径的话,可以

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

    停止:
    在开启服务的控制台 ,直接 ctrl + c即可停止

    5.连接和退出数据库

    连接:

    # 该命令默认连接本机的 MongDB 服务
    # 连接的前提是要先开启数据库
    mongo
    

    在这里插入图片描述
    退出:

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

    在这里插入图片描述

    6. MongoDB基本命令

    1. show dbs (查看显示所有数据库)
      在这里插入图片描述

    2. db (查看当前操作的数据库)
      在这里插入图片描述
      默认会连接test
      在这里插入图片描述
      show dbs没有test,原因是test现在没有数据,当往test中插入数据时,test就会自动被创建出来了

    3. use 数据库名称(切换到指定的数据库,如果没有自动新建)

    在这里插入图片描述

    • show dbs的时候,还是没有itcast
      在这里插入图片描述

    • 插入集合数据

    • MongoDB的增删改查就是在调它自己的API,类似于JS语法
      存数据相当于在存对象

    • 可以认为student就是一个数组集合相当于是一个数组
      在这里插入图片描述
      显示集合
      在这里插入图片描述
      查询集合中的所有数据

    在这里插入图片描述

    MongoDB在存数据的时候非常灵活,没有任何结构上的限制,插入数据时,不用像关系型数据库那样去更改表结构,相当于JavaScript的数组和对象,是动态的,可以任意创建和存储

    在这里插入图片描述

    7. 在Node.js中如何操作MongoDB数据库

    1. 使用官方的mongodb包来操作

    node.js-mongoDB仓库
    github仓库的官方文档

    1. 使用第三方包mongoose来操作MongoDB数据库
      第三方包:mongoose基于MongoDB官方的mongodb包再一次做了封装

    8. mongoose

    官网:https://mongoosejs.com/
    官方指南:https://mongoosejs.com/docs/guide.html
    官方API文档:https://mongoosejs.com/docs/api.html

    在这里插入图片描述
    使用:

    1. 初始化 npm init -y
      在这里插入图片描述

    2. 安装 mongoose

    在这里插入图片描述

    1. hello world
    //es6语法
    //导入mongoose包
    const mongoose = require('mongoose');
    // 连接 MongoDB 数据库
    mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
    
    // 创建一个模型
    // 就是在设计数据库
    // MongoDB 是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
    // mongoose 这个包就可以让你的设计编写过程变的非常的简单
    const Cat = mongoose.model('Cat', { name: String });
    //会自动帮助我们创建一个集合(mysql中的表)
    //虽然名称时大写的,但是它会自动帮助我们转换为小写复数的名称
    
    //持久化保存Kitty实例
    const kitty = new Cat({ name: 'Zildjian' });
    kitty.save().then(() => console.log('meow'));
    
    //es5语法
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test', { useMongoClient: true });
    //mongoose.Promise = global.Promise;
    var Cat = mongoose.model('Cat', { name: String });
      // 实例化一个 Cat
      var  kitty = new Cat({ name: 'Zildjian' });
      // 持久化保存 kitty 实例
      kitty.save(function (err) {
        if (err) {
          console.log(err);
        } else {
          console.log('meow');
        }
      });
    

    node执行命令后的结果:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    遍历循环存储10个对象的栗子:

    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
    const Cat = mongoose.model('Cat', { name: String });
    //遍历循环存储10个对象
    for(var i =0 ;i<10;i++){
    	var kitty = new Cat({ name: '喵喵' + i });
    	kitty.save().then(() => console.log('meow'));
    }
    

    在这里插入图片描述

    9. mongoose开始(设计Schema发布model)

    1. 连接数据库

    指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来

    mongoose.connect('mongodb://localhost/itcast')
    
    1. 设计文档结构(表结构)

    字段名称就是表结构中的属性名称 约束的目的是为了保证数据的完整性
    不要有脏数据

    var userSchema = new Schema({
      username: {
        type: String,
        required: true // 必须有
      },
      password: {
        type: String,
        required: true
      },
      email: {
        type: String
      }
    })
    
    1. 将文档结构发布为模型

    mongoose.model 方法就是用来将一个架构发布为 model 第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
    mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
    例如这里的 User 最终会变为 users 集合名称 第二个参数:架构 Schema
    返回值:模型构造函数

    var User = mongoose.model('User', userSchema)
    
    1. 当我们有了模型构造函数之后,就可以使用这个构造函数对 users 集合中的数据进行操作了(增删改查)

    10.增加数据

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

    来吧展示:

    在这里插入图片描述

    11.查询数据

    find() (查询所有)

    //查询数据
    //查询所有数据
    User.find(function(err,ret){
      if(err){
        console.log('查询失败')
      }
      else {
        console.log(ret)
      }
    })
    

    来吧展示:

    在这里插入图片描述
    find() (按条件查询所有)

    //带有条件的查询
    User.find({username: 'Tom'}, function (err, ret) {
       if (err) {
         console.log('查询失败')
       } else {
         console.log(ret)
      }
     })
    

    来吧展示:

    在这里插入图片描述

    注意:哪怕只有一条数据,也会放到对应的数组当中

    findOne() (按条件查询单个)

    // findOne() 查询的直接是一个对象,而不是一个数组
    User.findOne({
      username: 'Tom'
     }, function (err, ret) {
       if (err) {
         console.log('查询失败')
      } else {
         console.log(ret)
       }
     })
    

    来吧展示:

    在这里插入图片描述
    如果findOne()没有给条件,那么查询到的就是插入的第一条数据

    //findOne()不给条件查询
    User.findOne(function (err, ret) {
       if (err) {
         console.log('查询失败')
      } else {
         console.log(ret)
       }
     })
    

    来吧展示:
    在这里插入图片描述
    带有多条件的查询

    在这里插入图片描述
    在这里插入图片描述

    12.删除数据

    remove()(根据条件删除所有)

    //删除数必须带上条件
    User.remove({username:"Tom"},function(err,ret){
      if(err){
        console.log('删除失败')
      }
      else{
        console.log('删除成功')
        console.log(ret)
      }
    })
    

    来吧展示:

    在这里插入图片描述
    再次查询所有数据,发现Tom这一条数据已经不存在了

    来吧展示:
    在这里插入图片描述
    findOneAndRemove() (根据条件去删除一个)

    findByIdAndRemove() (根据id去删除一个)

    13.更新数据

    update() (根据条件去更新所有)

    findOneAndUpDate() (根据条件去更新一个)

    findByIdAndUpdate()(根据id去更新一个)

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

    来吧展示:

    在这里插入图片描述

  • 相关阅读:
    如何在Epower工作流平台(企业流程管理平台)上建立OA系统
    工作流管理系统应按需选型
    在工作流基础上的解决方案清单
    优化IT企业基础架构
    DataGrid控件用法
    Oracle设置初始化参数 REMOTE_LOGIN_PASSWORDFILE
    淘宝网的剩余时间(倒计时)实现
    Orace sequenced 简单介绍(自增长字段)
    C#与Oracle开发中执行存储过程问题
    ASP.NET中回车触发指定按钮的事件
  • 原文地址:https://www.cnblogs.com/Chinatsu/p/13823152.html
Copyright © 2011-2022 走看看