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 来控制从服务器




posted @ 2019-05-16 11:57  CCH-Taurus  阅读(164)  评论(0编辑  收藏  举报