关系型数据库与非关系型数据库,MongoDB数据库操作

本文对比了关系型数据库与非关系型数据库的特点,详细阐述了各自的优缺点,并深入介绍了MongoDB数据库的备份恢复、监测、创建、删除、查询等操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、关系型数据库与非关系型数据库的对比

1、关系型数据库:

 采用关系模型(二维表)来组织数据结构的数据库

 oracle   DB2    SQLServer    Mysql   SQLite

 优点:*容易理解,逻辑类似常见的表格

       *使用方便,都使用sql语句,sql语句非常成熟

       *数据一致性高,冗余低,数据完整性好,便于操作

       *技术成熟,功能强大,支持很多复杂操作

                     
 缺点:*每次操作都要进行sql语句的解析,消耗较大

      *不能很好的满足并发需求,特别是海量数据爆发,关系型数据库读写能力会显得不足

      *关系型数据库往往每一步都要进行加锁的操作,也造成了数据库的负担

      *数据一致性高,有时也会使数据的存储不灵活

2、 非关系型数据库(NoSql)

      优点:*高并发,读写能力强

            *弱化数据结构一致性,使用更加灵活

            *有良好的可扩展性

     缺点:*通用性差,没有sql语句那样通用的语句

           *操作灵活导致容易出错和混乱

           *没有外键关联等复杂的操作


   Nosql的使用情况:

       1、对数据存储灵活性要求高,一致性要求低

       2、数据处理海量并发,要求瞬间效率速度比较高

       3、数据比较容易建立Nosql模型

       4、网站灵活时缓冲存储,爬虫应用

 Nosql 的分类:

             1、键值型数据库   Redis

             2、文档型数据库   MongoDB 

             3、列存储数据库    HBase

             4、图形数据库

二、MongoDB数据库的使用

 1、数据库的备份和恢复

       备份:mongodump  -h  dbhost  -d  dbname  -o  bak

                e.g.将本机stu数据库备份到bak目录下

                    mongodump -h 127.0.0.1 -d stu -o bak

       恢复:mongorestore  -h  dbhost:port  -d  dbname  path

              e.g.将本地bak下stu数据库恢复到res数据库中(res不存在会自动创建)

                   mongorestore -h 127.0.0.1:27017 -d res bak/stu

 2、  数据库的监测

      
     (1)mongostat 用来监测数据库运行数据                  

          insert query update delete  :每秒增删改查的次数

          flushes  :每秒和磁盘的交互次数

          vsize  :虚拟内存

          res  :  物理内存

          time:时间

  

     (2) mongotop   监控数据库读写时长

         ns :数据表

         total:总时间

         read :读时间

         write:写时间

  3、创建数据库:use databaseName

       e.g.创建一个名字为stu的数据库:use  stu

        *use实际为选择使用哪个数据库,当数据库不存在时会自动创建

        *use后并不会立即创建出数据库,而是需要等到插入数据时数据库才会创建


  4、 查看系统中的数据库:show  dbs

  5、 删除数据库

      db.dropDatabase()

      删除db所代表的数据库

  6、 创建集合

      方法1:db.createCollection(collection_name)

          e.g.创建class1集合:db.createCollection('class1')

       方法2:

            当向一个集合众插入数据的时候如果集合不存在则自动创建集合
 
   7、 查看数据库集合

       show  collections  或  show  tables

   8、删除集合:db.collection.drop()

       e.g. 删除class2集合

            db.class2.drop()

   9、 集合的重命名

         db.collection.renameCollection("new_name")

         e.g.将class重命名为class0

              db.class.renameCollection("class0")

   
  10、集合的文档
   
   (1)集合中文档的特点:

         1)集合中的文档不一定有相同的域

                   *个数不同

                   *域不相同

                   *数据类型不同

         2)集合中文档各自比较独立,相互并不影响
   
   (2) 插入文档:db.collection.insert()

         插入单个文档

            db.class0.insert({'name':'Lucy','age':18,'sex':'w'})
             
         *查看插入结果 db.class0.find()

         插入多条文档

             db.class0.insert([{},{},{}])
         
         **其他插入方法:

           insertone()   插入一条文档

           insertMany()  插入多条文档

         **save插入文档

          db.collection.save()

           *如果正常插入与insert相同

           *如果插入数据是有_id 域,且_id域值存在时则会修改原有文档,如果该值不存在则正常插入

          e.g.  db.class0.save({name:'Bob',age:19,sex:'m'})

                db.class0.save([{name:'Sunny',age:18,sex:'w'},{name:'Alice',age:22,sex:'w'}])


    11、查询操作:db.collection.find(query,field)

      (1)查找所有内容:db.collection.find()

      (2)find(query,field)
         
           query:以键值对方式传递参数,如果是空则表示查找所有内容  
      
           field:以键值对的方式给出要查找(不查找)的域, 
                  以域名为键,以0,1为值分别表示不查找和查找

                  e.g.db.class0.find({sex:'w'},{_id:0})
 
           注意:*如果某一个或者多个域设置为0,表示这些域不查找,其他域均查找

                 *如果某一个或多个域设置为1,表示这些域查找,其他域均为不查找

                 *_id 除非设置为0否则均会查找

                 *除_id 域其他域不能有的设置为0,有的设置为1

                 e.g.  查找结果只有name域:db.class0.find({sex:'w'},{_id:0,name:1})

      (3)findOne(query,field)

            功能:查找第一条符合条件的文档

     (4)query更多的筛选用法

         操作符:使用$符号注明的一个特殊字符串,表达一定的含义,比如$lt  表示小于


         比较操作符使用:

              $eq    等于==

                   e.g.查找年龄为18 的文档 :db.class0.find({age:{$eq:18}},{_id:0})

              $lt     小于  <

                    e.g.  查找所有年龄小于18的:db.class0.find({age:{$lt:18}},{_id:0})

                                             db.class0.find({name:{$lt:'John'}},{_id:0})

              $lte    小于等于    <=

                    e.g.  查找年龄小于等于18的:db.class0.find({age:{$lte:18}},{_id:0})

              $gt     大于      >

                  e.g.查找年龄大于16小于19 的:db.class0.find({age:{$gt:16,$lt:19}},{_id:0}) 


              *在mongodb中所有的{} []中都可以写多个条件,但根据参数的不同表达的意思不一样



              $gte      大于等于     >=

                  e.g.查找年龄大于等于19的:  db.class0.find({age:{$gte:19}},{_id:0})

              $ne       不等于      !=

                   e.g. 查找性别不为‘w’的: db.class0.find({sex:{$ne:'w'}},{_id:0})

        (5) 逻辑操作符

             $and

                在query中如果写多个条件默认即为and关系

                e.g.  db.class0.find({age:{$lt:18},sex:'m'},{_id:0})

            逻辑与  $and

               e.g.  db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})

            逻辑或   $or

               e.g.  db.class0.find({$or:[{age:{$lt:16}},{age:{$gt:18}}]},{_id:0})

            逻辑非  $not   

            既不也不  $nor   

                 e.g.  db.class0.find({$nor:[{sex:'m'},{age:{$lt:18}}]},{_id:0}) 

                       db.class0.find({$nor:[{name:{$lt:'Lucy'}},{age:{$gt:18}}]},{_id:0})

        (6)逻辑条件混合

             年龄大于 17 并且为 男性 或者姓名叫 Abby

              db.class0.find({$or:[{age:{$gt:17}},{sex:'m'},{name:'Abby'}]},{_id:0})

             年龄不大于18   或者  为女性  并且  姓名  大于Lucy

       db.class0.find({$and:[{$or:[{age:{$lt:18}},{sex:'w'}]},{name:{$gt:'Lucy'}}]},{_id:0})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值