zoukankan      html  css  js  c++  java
  • MongoDB学习笔记

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

    学习网站
      https://www.runoob.com/mongodb/mongodb-tutorial.html

    使用范围和限制
      缺点:不支持连表查询,不支持sql语句,不支持食物存储过程等,所以不适合存储数据见关系比较复杂的数据,一般当做数据仓库来使用。
      适用于:日志系统,股票数据等(***数据仓库***)
      不适用于:电子商务系统等需要连表查询的系统

    基本概念
      文档:是MongoDB中数据的基本单元,类似关系数据库中的行,例如:下列的每一行就是一个文档,并且属于不同文档
        {"username":"Tom","age":21}
        {"UserName":"Tom","age":"21"}
        注意:
          区分大小写数据类型;
          每一个文档尺寸不能超过16M;
      集合:多个文档组成一个集合,类似于关系数据库的表
      无模式:同一个集合中可以包含不格式的文档;
      模式自由:集合中没有行和列的概念;
        注意:集合不用预先创建,没有结构。
      数据库:多个集合组成数据库,同关系数据库中数据库
        注意:MongoDB中的数据库无需创建

    安装
      官网下载地址:https://www.mongodb.com/download-center/community

    创建数据库
      语法:use 数据库名称
      注意:数据库不存在,则会创建,存在,则切换,如果创建了数据库,没有任何操作,则会自动删除数据库。

    查看数据库
      语法:show dbs

    创建集合
      向集合中插入文档的语法:db.集合名.insert({})
      例如:db.person.insert({'name':'Tom'})
      注意:MongoDB中的集合无需创建,直接使用

    查看集合
      语法:show tables

    查询集合中的文档
      语法:
      db.集合名.find() 查询所有
      db.集合名.findOne() 查询第一个文档

    删除集合
      语法:db.集合名.drop()

    删除数据库
      语法:db.dropDatabase()

    帮助命令
      全局帮助:help
      数据库相关的帮助:db.help()
      集合相关的帮助:db.集合名.help()

    添加文档
      语法:db.person.insert({key:value})
      注意:文档就是键值对,数据类型是BSON格式,支持的格式更丰富。
      BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
      每个文档都有一个'_id'字段,表示主键,可以是任意类型,默认是ObjectId对象,可以自己指定,不能重复,插入重复的值,则会报错。

      可以使用js代码批量插入,例如:
        for(var i=1;i<10;i++){
          db.user.insert({_id:i,name:'tom_'+i});
        }

    删除文档
      语法:db.集合名.remove({条件})
      不写条件表示删除所有文档
      例如:删除user集合中name等于tom的文档
        db.user.remove({name:'tom'})

      条件判断可以使用操作符实现,常用操作符如下:
        $lt <, $lte <=, $gt >, $gte >=,$ne !=,$in, $nin, $or, $not
        $mod(取模), $exits, $where
      例如:删除年龄大于5的文档
        db.user.remove({age:{'$gt':7}})

    更新文档
      直接修改
        会完全替换文档
        语法:
          db.集合名.update({条件},{新文档})
          db.集合名.update(条件,新文档,是否新增,是否修改多条)

        是否新增:值是1(true),满足条件的则新增
        是否修改记录:值是1(true),如果满足条件的有多条文档则都要修改

      使用修改器
        可以指定修改某个键
        常用修改器:
          $inc:加一个数字
          $set:修改某个字段,如果该字段不存在,则添加
        语法:db.集合名.update({条件},{修改器名词:{修改的键:修改的值}})
        例如:
          修改age=3的文档的name为xiaotian,并且其它键值不丢失
          db.user.update({age:3},{"$set":{name:"xiaotian"}})

          修改name=xiaotian的age添加10岁
          db.user.update({name:xiaotian},{"$inc":{age:10}})

    查询文档
      语法:
        db.集合名.find({条件})
      例如:
        取出user集合中第一个
        db.user.findOne()

        取出user集合中age=2的
        db.user.find({age:2})

        取出user集合中age>2的
        db.user.find({age:{"$gt":2}})

        取出user集合中的文档,只显示name键
        db.user.find({},{age:1}) 1表示只显示age键
        db.user.find({},{age:0}) 0表示显示除了age以外的所有键
        注意:_id 键默认返回,需要主动指定 _id:0 才会隐藏

        根据age的降序或者升序来显示文档
        db.user.find().sort({age:1}) 1表示升序
        db.user.find().sort({age:-11}) -1表示降序

        显示user集合的前3个文档
        db.user.find().limit(3)

        显示user集合的第3个到第5个文档
        db.user.find().skip(2).limit(3)

        显示age=3或者name=xiaotian的文档
        db.user.find({$or:[{age:3},{name:"xiaotian"}]})

        查询 title 包含"教"字的文档:
        db.user.find({title:/教/})

        查询 title 字段以"教"字开头的文档:
        db.user.find({title:/^教/})

        查询 title 字段以"教"字结尾的文档:
        db.user.find({title:/教$/})

        统计user集合中文档的个数
        db.user.count()

    用户管理
      在MongoDB中,用户属于数据库,每个用户有自己的管理员,管理员登录后,只能操作所属的数据库
      注意:在admin数据库中创建的用户是超级管理员,登陆后可以操作任何的数据库

    创建用户
      步骤:
        1,选择数据库:use 数据库名
        2,添加用户:db.addUser(用户名,密码,是否只读)
      是否只读:默认为false,如果 为true,则用户只能查询
      注意:在创建管理员之前必须创建超级管理员
      创建的用户名和密码是存储在各自数据库中的system.user集合中

    验证权限
      语法:db.auth(用户名,密码)

    删除用户
      直接删除system.user集合中的文档即可

    普通单列索引
      语法:db.集合名.ensureIndex({键名:1}) 1是正序,-1是倒序

    多列索引(复合索引)
      语法:db.集合名.ensureIndex({键名:1,键名:1})

    查看索引
      查看当前的索引
        语法:db.集合名.getIndexes()
      查看本次查询语句使用的哪个索引
        语法:db.集合名.find().explain()

    子文档索引
      语法:db.集合名.ensureIndex({filed.subfield:1})
      例如:如下的文档
        {name:'洛基亚',price:12.34,spc:{weight:100,area:'纽约'}}
        可以建立如下索引:
        db.net.ensureIndex({spc.weight:1})

    唯一索引
      语法:db.集合名.ensureIndex({filed:1},{unique:true})

    删除索引
      删除单个
        db.集合名.dropIndex({filed:1})
      删除所有
        db.集合名.dropIndexes()

    重建索引
      一个表通过多次修改后,导致表的文件产生空洞,可以通过重建索引,减少文件碎片,并提高索引的效率。
      类似mysql的optimize table
      语法:db.集合名.reIndex()

    索引使用注意事项
      1,索引能提高查询性能,但同时会影响插入性能,所以对于经常查询少插入的文档可以考虑使用索引

    导出和导入数据
      导出
        命令:mongoexport
        -h host主机
        --port 端口
        -d 使用的库
        -c 导出的集合
        -o 导出的文件
        --cvs 指定导出的csv格式
        -q 过滤导出
        -f field1 field2 指定导出的列
        -u username 超级管理员用户名
        -p password 超级管理员密码

      导入
        命令:mongoimport
        -d 待导入的数据库
        -c 待导入的集合
        --type csv/json 导入数据的类型,默认json
        --file 备份文件路径

    主从复制
      是一个简单的数据库同步备份的集群技术
      至少两台数据库服务器,可以分别设置主服务器和从服务器,对主服务器的任务操作都会同步到从服务器。
      注意:
        1,主服务器只能有一台
        2,--master 用来确定主服务器, --slave 和 --source 来控制从服务器




  • 相关阅读:
    git连接到https服务器时出现“gnutls_handshake() failed”
    Linux内核:通知链 机制
    在Linux驱动中使用notifier通知链
    Linux 内核:RCU机制与使用
    什么是工程师文化?
    在Android源码中查找Java代码中native函数对应的C++实现
    Windows下Qt5程序打包发布
    Android Framework:如何让 App 拿到Power key 值
    Windows 监控小工具
    Windows 远程桌面无法上传文件或者文件夹
  • 原文地址:https://www.cnblogs.com/CCHUncle/p/10821975.html
Copyright © 2011-2022 走看看