• Mongo DB 数据库 使用的心得


    1、什么是Mongo DB?

      MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

      MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,在高负载的情况下,添加更多的节点,可以保证服务器性能。

      MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。

      MongoDB 文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组。

    2、命令行操作Mongo db

      2.1 准备工作

      官网下载解压mongodb文件

      D盘根目录下创建一个文件夹data,在data内部再创建一个文件夹db

      进入到mongodb的bin目录,按住shift,点击鼠标的右键,打开命令行窗口,输入如下指令打开数据库连接池

        mongod --dbpath d:datadb

      再在此目录中,按住shift,点击鼠标的右键,打开命令行窗口,输入如下指令打开一个连接数据库的客户端,不要关闭上一个窗口

        mongo

      如果这样不成功,说明是管理员权限的问题,那就需要多走几步路

      以管理员身份运行命令行窗口打开数据库连接池

        d:
        cd mongodb    (注意你自己的文件夹的名称)
        cd mongodb-win32-x86_64-2008plus-ssl-4.0.9
        cd bin
        mongod --dbpath d:datadb    

      以管理员身份运行命令行窗口打开客户端

        d:
        cd mongodb    (注意你自己的文件夹的名称)
        cd mongodb-win32-x86_64-2008plus-ssl-4.0.9
        cd bin
        mongo

      2.2 数据库常用命令

       2.2.1 help查看命令提示

        help 
        db.help() 
        db.test.help()
        db.test.find().help()

      2.2.2 创建切换数据库--------无则创建并且切换,有则切换

        db                    // test 
        use hupeng       // switched to db hupeng  
        db                    // hupeng   

      2.3.3 查询数据库

      show dbs

     2.3 collection 聚集集合操作

      2.3.1 创建一个聚集集合

        db.createCollection(name, options) 
        db.createCollection("collName", {size: 20, capped: true, max: 100});

      参数说明:

    • name: 要创建的集合名称

    • options: 可选参数, 指定有关内存大小及索引的选项xsa

    字段类型描述
    capped 布尔(可选) 如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
    autoIndexId 布尔(可选) 如为 true,自动在 _id 字段创建索引。默认为 false。
    size 数值(可选) 为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
    max 数值(可选) 指定固定集合中包含文档的最大数量。

      2.3.2 得到指定名称的聚集集合

        > db.getCollection('users') 
        hupeng.users
    

    3 数据的增删改查

     3.1  增

      db.collection.insertOne(document) // 向指定集合中插入一条文档数据
      db.collection.insertMany(document) // 向指定集合中插入多条文档数据  
      > db.users.insertMany([{
       username: '张三',
       password: '123',
       age: 20,
       sex: '男' },{
       username: '李四',
       password: '456',
       age: 16,
       tel: '15738353168',
       sex: '女'
      }])

      3.2  删

    > db.users.deleteOne({password: '123'}) //删除一条,password为123的数据
    { "acknowledged" : true, "deletedCount" : 1 }
    > db.users.find().pretty() //查询数据库的数据
    > db.users.deleteMany({}) //删除多条
    { "acknowledged" : true, "deletedCount" : 2 }
    > db.users.find().pretty()

      3.3  改

      db.col.updateOne({key: value}, {$set: {key: value}}) //修改第一条key为value的数据
      db.col.updateMany({key: value}, {$set: {key: value}}) //修改多条key为value的数据
       db.col.updateOne({key: value}, { $inc: {key: num}})   //修改某一条数据的某一个字段key的自增自减num(num为正->加,num为负->减)

        3.4  查

    > db.users.find().pretty() // 查询所有的数据,显示所有的字段
    > db.users.find({},{_id: 0}).pretty() // 不显示_id字段
    >db.users.find({},{_id: 0, username: 1, age: 1}).pretty() // 不显示_id字段,显示username字段'和age字段,0为不显示,1为显示
    >db.users.find({username: '李四'},{_id: 0}).pretty() //显示username为张三的数据
    >db.users.find({age: { $gte: 18, $lte: 20}}, {_id:0}).pretty()
    // 大于:$gt 大于等于:$gte 小于:$lt 小于等于:$lte
    >db.users.find({}, {_id: 0}).sort({age: 1}).pretty()//按照年龄排序 .sort({key:num}) num为1表示按照key值升序,为-1表示降序
    模糊查询:
    >db.users.find({username:'四'}, {_id:0}).pretty() // 精确查询,没有数据 没有username为 “四” 的
    >db.users.find({username: /四/}, {_id:0}).pretty()//找username中含有 “四” 的数据
    >db.users.find({ $or: [{username: /三/}, {username: /四/}]}, {_id:0}).pretty()//查询名字中含有三或者 含有四的 * $or
    >  .distinct('city')   //查询所以数据的city字段组成数组,并且去重
    >  .count()   //查询的条数
    >  .toArray() //转换成数组
    >  .limit(num) //只能查询num条数据
    >  .skip(n)   //从第n条开始查,下标从0开始

    4 封装数据库模块

    const sql = {
      // 数据库集合靠函数去传递
      insert (CollectionName, insertData) {                                     //插入
        // 数据库的操作属于异步操作,后续的业务逻辑会交给执行的那个单位
        // A 调用了B B包含异步操作,操作完毕 A继续执行业务逻辑
        // 异步操作  --- 回调函数 / promise / generator + yeild / async + await
        // User.insertMany(insertData, (err) => {
        //   if (err) throw err;
        //   console.log('插入成功')
        // })
        // promise的写法
        // return new Promise((resolve, reject) => {
        // })
        return new Promise((resolve, reject) => {
          CollectionName.insertMany(insertData, (err) => {
            if (err) throw err;
            resolve()
          })
        })
      },
      delete (CollectionName, deleteData, deleteType) {                        //删除
        // User.deleteOne(deleteData, (err) => {})
        // User.deleteMany(deleteData, (err) => {})
        // style.display = "none"   <===>  style['display'] = "none"
        // style.animation = "test" 兼容性 
        // 对象后的属性不可以是变量,如果有变量,写成 对象[属性] 形式
        deleteType = deleteType || 'deleteOne' // 默认为删除单条数据
        return new Promise((resolve, reject) => {
          CollectionName[deleteType](deleteData, (err) => {
            if (err) throw err;
            resolve()
          })
        })
      },
      update (CollectionName, whereObj, updateObj, updateType) {               //修改
        updateType = updateType || 'updateOne'
        return new Promise((resolve, reject) => {
          CollectionName[updateType](whereObj, updateObj, (err) => {
            if (err) throw err;
            resolve()
          })
        })
      },
      find (CollectionName, whereObj, showObj) {                                //查询
        return new Promise((resolve, reject) => {
          CollectionName.find(whereObj, showObj).exec((err, data) => {
            if (err) throw err;
            resolve(data)
          })
        })
      }
    }
    module.exports = sql
  • 相关阅读:
    Redis在Windows上使用和集群配置
    Lzma(7-zip)和zlib
    Windump教程-参数介绍
    Windows 使用windump进行循环抓包
    wireshark长时间抓包分多个文件
    发现TCP的一种错误----客户端连接失败(10055错误号)
    MySQL [Err] 1055
    解决socket交互的10048和10055错误的总结
    Socket调用Close后如何终止套接口的问题
    linux下recv 、send阻塞、非阻塞区别和用法
  • 原文地址:https://www.cnblogs.com/hupeng1996/p/11703246.html
Copyright © 2020-2023  润新知