mongodb数据库的安装及使用

  • 数据库:在计算机中长期帮应用存储数据的。

数据库分类

  • 关系型数据库 : mysql , orcale , sqlserver
    关系型数据库最典型的数据结构是表,由二维表机器之间的练习所组成的一个数据组织
    优点:

    1. 易于维护 : 易于维护 : 都是使用表结构,格式一致;Mysql orcale sqlserve都是基于SQL语句的,格式是非常像的。
    2. 使用方便:SQL语言通用,可用于复杂查询;
    3. 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。多表查询,表关联的操作,事务操作,触发器。
      缺点:
    4. 读写性能比较差,尤其是海量数据的高效率读写;操作sql语句,内部非常耗性能。
    5. 固定的表结构,灵活度稍欠
    6. 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
  • 非关系型数据库:mongodb、redis …
    非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。mongodb-> 文档 类似于JSON的数据 ,数据库底层存储的是 二进制JSON(BSON)
    优点 :

    1. 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
    2. 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
    3. 高扩展性
    4. 成本低:nosql数据库部署简单,基本都是开源软件
      缺点 :
    5. 不提供sql支持,学习和使用成本较高
    6. 无事务处理
    7. 数据结构相对复杂,复杂查询方面稍欠

启动mongodb的具体操作

  1. 下载 : https://www.mongodb.com/try/download/community
  2. 把bin目录添加到环境变量中,这样可以全局访问
  3. 启动数据库 : mongod --dbpath=d:/(自己新建的文件目录) 。 默认端口号:27017
  4. 可视化工具 : 下载Robo 3T

mongodb操作语法

  1. show dbs : 查看所有数据库,但是如果这个数据库是空的,是不显示的。local -> 初始是有值的数据库; test -> 空的数据库.
  2. use [dbname] -> 切换数据库,如果dbname不存在,那么就创建一个数据库,并且切换到这个数据上.
  3. db.createCollection([collname]) -> 创建一个集合
  4. db.dropDatabase() : 删除当前数据库
  • 具体查看mongodb相关方法 :

    1. db.help() : 查看数据库的方法
    2. db.test.help() : 查看test数据库的方法
    3. db.test.find().help() : 查看find()方法下的方法
  • Collection集合操作 :

    1. db.createCollection(‘musiclist’) 创建一个集合
    2. db.getCollection(‘musiclist’) 查看musiclist集合
    3. db.getCollectionNames() : 查看当前数据下的所有集合
    4. show collections : 可以查看现在有多少个集合
    5. db.printCollectionStats() : 查看集合的状态
    6. db.musiclist.drop() : 删除集合
  • 数据库增加方法 :

    1. db.集合名.insert({}); //单条添加
    2. db.集合名.insert([{},{},{}]); //多条添加
    3. db.集合名.insertMany([{},{},{}]); //多条添加
    4. db.集合名.save({}); //单条添加
    5. db.集合名.save([{},{},{}]); //多条添加
  • 数据库的删除方法 :

    1. db.集合名.deleteOne({}) 删除一条数据
    2. db.集合名.deleteMany({}) 删除所有数据
    3. db.集合名.remove({}) 删除所有数据
    4. db.集合名.drop() 删除当前集合
  • 数据库的修改方法 :

    1. db.集合名.update({},{$set:{users:“张杰”}})
    2. s e t − > 修 改 字 段 值 , set -> 修改字段值, set>inc -> 累加累减字段值(必须是数字类型)
  • 数据库查找方法 :

    1. db.集合名.find() : 查看当前集合的所有数据
    2. db.集合名.find().count() : 数据的个数
    3. db.集合名.find({},{name:1,age:1}) : 查询指定字段的数据
    4. db.集合名.find().sort({age : 1}) 1 升序 -1 降序
    5. db.集合名.find().skip(10) : 跳过10条
    6. db.集合名.findOne() : 找一条数据(默认就是第一条)

mongoose

  • Mongoose库简而言之就是对node环境中MongoDB数据库操作的封装。一种对象模型工具,可以将数据库中的数据转换为JavaScript对象供我们使用。对mongodb操作变的简单方便。

  • mongoose是基于promise开发的,所有promise方法都可以使用。

  • 下载安装 : npm i -S mongoose

  • 引入并创建链接

  • 连接数据库 : mongoose.connect(‘mongodb://127.0.0.1:27017/music’, (err)=>{});

  • schema是mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力。

  • model是由schema生成的模型,可以对数据库进行操作。

var express = require('express');
var mongoose = require('mongoose');
const { stringify } = require('querystring');

mongoose.connect('mongodb://localhost:27017/musiclist',{ useNewUrlParser: true , useUnifiedTopology: true },(err)=>{
    if(err){
        console.log('数据库连接失败!!!');
        return;
    }
    console.log('数据库连接成功!!!');
    //3. Schema : 就是规范集合(表)的字段类型和值的。用schema定义集合。
        //规范:
            //1. 多出规定的字段,是添加不进去这个字段的
            //2. 少了规定的字段,整体是可以添加的(默认行为)
                //那么如何能规定,必选字段呢? required属性
                //如果可选字段的情况下,如何添加默认值呢? default属性
            //3. 指定唯一字段的索引值,unique属性
    var musicListSchema = mongoose.Schema({
        // id: { type: Number, required: true},
        musicname: { type: String, unique: true },
        musicsiger : String,
        sigerage : { type : Number , required : true },
        // sigerage : { type : Number },
        // date : { type : Date , default : new Date() },
        // email : { type : String , unique : true }
        // email: { type: String}
    })
    //4. Model 是由schema生成的模型,可以对数据库进行操作。创建集合。
    // 第一个参数:model模型的名字
    // 第二个参数:schema对象
    // 表的名字会自动创建:
        //根据 第一个参数 musicList -> musiclists
        //根据 第一个参数 musiclists -> musiclists
    // 第三个参数:表的名字(可选项)
    var MusicListModel = mongoose.model('musiclist' , musicListSchema , 'mao');

    //数据库的添加操作 : 单条
    /* MusicListModel({
        // id : 1,
        musicname: "22",
        musicsiger : "毛不易",
        sigerage : 26,
    }).save().then((res)=>{
        console.log(res);  // 返回的就是添加成功的这条数据
    }).catch((err)=>{
        //console.log(err);
        if(err){
            console.log(err)
            console.log('数据添加失败');
        }
    }); */


     //数据库的添加操作 : 多条
    /* MusicListModel.insertMany([
        {
            id : 1,
            musicname : "消愁",
            musicsiger : "毛不易",
            sigerage : 28
        },
        {
            id: 2,
            musicname: "像我这样的人",
            musicsiger: "毛不易",
            sigerage: 28
        },
        {
            id : 3,
            musicname : "盛夏",
            musicsiger : "毛不易",
            sigerage : 28
        },
        {
            id : 4,
            musicname: "牧马城市",
            musicsiger: "毛不易",
            sigerage: 28
        },
        {
            id: 5,
            musicname: "借",
            musicsiger: "毛不易",
            sigerage: 28
        },
        {
            id: 6,
            musicname: "不染",
            musicsiger: "毛不易",
            sigerage: 28
        }
]).then((res)=>{
        console.log(res);  // 返回的就是添加成功的数组格式的数据
    }).catch((err)=>{
        console.log(err);
    }); */

    //查询:find()
    /* MusicListModel.findOne().then((info)=>{
        console.log(info);   // 查询一条数据的结构,返回对象类型。
    }); */

    /* MusicListModel.find({"sigerage":"42"}).then((infos)=>{
        console.log(infos);   // 查询所有数据,并返回一个数组类型。
    }); */

    //find的第一个参数:是查询条件,第二个参数:返回指定的字段
    /* MusicListModel.find({},{"sigerage":1}).skip(1).limit(3).then((infos)=>{
        console.log(infos);   // 查询所有数据,并返回一个数组类型。
    }); */

    //更新数据
    /* MusicListModel.update({},{$set : {"musicname":"七里香"}}).then((info)=>{
        console.log(info);   // 
    }); */

    //删除数据
    //删除一条数据
    /* MusicListModel.deleteOne({ }).then((info)=>{
        console.log(info);  
    }); */
    //删除所有数据
    /* MusicListModel.remove().then((info)=>{
        console.log(info);  
    }); */
   
});

mongodb的增删查改封装


module.exports = {
  insert (CollectionName, insertData) {
    return new Promise((resolve, reject) => {
      // node 错误优先回调原则
      CollectionName.insertMany(insertData, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  },
  delete (CollectionName, whereData, deleteNum) {
    return new Promise(resolve => {
      const deleteType = deleteNum === 1 ? 'deleteMany' : 'deleteOne'
      CollectionName[deleteType](whereData, err => {
        if (err) throw err;
        resolve()
      })
    })
  },
  update (CollectionName, whereData, updateData, updateNum) {
    return new Promise(resolve => {
      const updateType = updateNum === 1 ? 'updateMany' : 'updateOne'
      CollectionName[updateType](whereData, updateData, err => {
        if (err) throw err;
        resolve()
      })
    })
  },
  find (CollectionName, whereData, showData) {
    return new Promise(resolve => {
      CollectionName.find(whereData, showData).exec((err, data) => {
        if (err) throw err;
        resolve(data)
      })
    })
  },
  paging (CollectionName, whereData, showData, count, limitNum) {
    limitNum = limitNum || 10 
    count = count || 1
    return new Promise(resolve => {
      // 页码 不是从0  开始, 是从1开始,所以要减1
      CollectionName.find(whereData, showData).limit(limitNum).skip((count - 1) * limitNum).exec((err, data) => {
        if (err) throw err
        resolve(data)
      })
    })
  },
  count (CollectionName) {
    return new Promise(resolve => {
      // count() 在某些 版本 不可用
      // countDocuments() ok
      // estimatedDocumentCount() ok
      CollectionName.find().estimatedDocumentCount((err, len) => {
        if (err) throw err
        resolve(len)
      })
    })
  },
  distinct(CollectionName, type) {
    return new Promise((resolve) => {
      CollectionName.distinct(type).exec((err, data) => {
        if (err) throw err
        resolve(data)
      })
    })
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值