MongoDB

作者: 找呀找提莫 | 来源:发表于2020-03-06 13:34 被阅读0次

    [toc]

    1 NoSQL简介

    • NoSQL,全名为Not Only SQL,指的是非关系型数据库;
    • 随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来;

    1.1 优点缺点

    • 优点:

      • 高可扩展性
      • 分布式计算
      • 低成本
      • 架构的灵活性,半结构化数据库
      • 没有复杂的关系
    • 缺点:

      • 没有标准化
      • 有限的查询功能
      • 最终一致是不直观的程序,看起来不直观

    1.2 分类

    类型 部分代表 特点
    列存储 Hbase
    Cassandra
    Hypertable
    顾名思义,是按列存储数据的;最大的特点是方便存储结构化和半结构化数据,方便数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
    文档存储 MongoDB
    CouchDB
    文档存储一般用类似json的格式存储,存储内容是文档型的;这样也就有机会对某些字段简历索引,实现关系数据库的某些功能。
    key-value存储 Tokyo Cabinet / Tyrant
    Berkeley DB
    MemcacheDB
    Redis
    可以通过key快速查询到其value,一般来说,存储不管value的格式,照单全收。<vr>(Redis包含了其他功能)
    图存储 Neo4J
    FlockDB
    图形关系的最佳存储。
    使用传统的图形关系数据库来解决图形存储的话,性能低下而且设计使用不方便。
    对象存储 db4o
    Versant
    通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
    xml数据库 Berkekey DB XML
    BaseX
    搞笑的存储XML书记,并支持XML的内部查询语法,比如XQuery、Xpath。

    2 MongoDB 部署

    2.1 名词解释

    SQL术语 MongoDB术语 解释/说明
    database database 数据库
    table collection 数据库表/集合
    row document 数据记录行/文档
    column field 数据字段/域
    index index 索引
    table join 表连接,MongoDB不支持
    primary key primary key 主键,MongoDB自动将_id字段设置为主键
    • 三元素:数据库、集合、文档

      • 集合就是关系数据库的表
      • 文档对应着关系数据库中的行
    • 数据库:是一个集合的物理容器,一个数据库中可以包含多个集合;一个服务器通常有多个数据库

    • 集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中;

    • 文档:就是一个对象,由键值对构成,是Json的扩展Bson形式:{'name':'lance', 'gender':'Boy'}

    2.2 安装MongoDB

    tar -zxvf mongodb-linux-x86_64-3.6.5.tgz 
    
    mv mongodb-linux-x86_64-3.6.5 /usr/local/
    cd /usr/local/
    ln -s mongodb-linux-x86_64-3.6.5 mongodb
    

    2.3 配置MongoDB环境变量

    vim /etc/profile
        MONGO_HOME=/usr/local/mongodb
        export PATH=$PATH:$MONGO_HOME/bin
    
    source /etc/profile
    

    2.4 创建数据目录

    mkdir -p /mydata/mongodata
    
    确保运行MongoDB的账户,对MongoDB的数据目录有读写权限
    

    2.5 启动MongoDB

    mongod --bind_ip_all --logpath /mydata/mongodata/mongod.log --fork --dbpath /mydata/mongodata/
        选项:
            --bind_ip_all   允许所有 ip 访问,默认是127.0.0.1
            --logpath       将 stdout 的内容输出到日志文件
            --fork          后台运行 MongoDB
            --dbpath        MongoDB 的数据布姆
    

    2.6 关闭MongoDB

    mongod --shutdown --dbpath /mydata/mongodata/
    

    2.7 连接MongoDB

    mongo 命令即可直接连接到本地的MongoDB
    

    3 Mongo操作

    3.1 基本命令

    命令 作用
    db 查看当前数据库名称
    db.stats() 查看当前数据库信息

    3.2 数据类型

    数据类型 解释
    Object ID 文档ID
    String 字符串,最常用,必须是有效的UTF-8
    Boolean 存储一个布尔值,true或false
    Integer 整数可以是32位或64位,这取决于服务器
    Double 存储浮点值
    Arrays 数组或列表,多个值存储到一个键
    Object 用于嵌入式的文档,即一个值为一个文档
    Null 存储Null值
    Timestamp 时间戳
    Date 存储当前日期或时间的UNIX时间格式

    3.2.1 object id

    • 每个文档都有一个属性,为_id,保证每个文档的唯一性;;
    • 可以自己去设置_id插入文档;;
    • 如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID;
    • objectID是一个12字节的十六进制数:
      • 前4个字节为当前时间戳;
      • 接下来3个字节的机器ID;
      • 接下来的2个字节中MongoDB的服务进程id;
      • 最后3个字节是简单的增量值;

    3.3 数据库操作

    • db
      • 查看当前数据库名称
    • show dbs
    • show databases
      • 查看所有数据库名称;
      • 列出所有在物理上存在的数据库;
    • use 数据库名称
      • 切换数据库;
      • 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建;
      • 默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中;
    • db.dropDatabase()
      • 删除当前指向的数据库;
      • 如果数据库不存在,则什么也不做;

    3.4 集合操作

    • db.createCollection(name, options)
      • name是要创建的集合的名称;
      • options是一个选项,用于指定集合的配置;选项参数是可选的,所以只需要到指定的集合名称。
        • 参数capped:默认值为false表示不设置上限,值为true表示设置上限
        • 参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
    例子:
            db.createCollection("sub", { capped : true, size : 10 } )
    
    • show collections
      • 查看当前数据库的集合
    • db.集合名称.drop()
      • 删除集合

    3.5 文档操作

    3.5.1 插入

    • db.集合名称.insert(document)
      • 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId;

    3.5.2 更新

    • db.集合名称.update(<query>, <update>, {multi: <boolean>})
      • 参数query:查询条件,类似sql语句update中where部分;
      • 参数update:更新操作符,类似sql语句update中set部分;
        • 指定属性更新,通过操作符$set
      • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
    例子:
        db.stu.update({name:'hr'},{name:'mnc'})<br>
        db.stu.update({},{$set:{gender:0}},{multi:true})
    

    3.5.3 保存

    • db.集合名称.save(document)
      • 如果文档的_id已经存在则修改,如果文档的_id不存在则添加;
    例子:
        db.stu.save({_id:'20160102','name':'yk',gender:1})
    

    3.5.4 删除

    • db.集合名称.remove(<query>, {justOne: <boolean>})
      • 参数query:可选,删除的文档的条件;
      • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条;

    3.5.5 查询

    • db.集合名称.find({条件文档})
      • 查询,返回全部;
    • db.集合名称.findOne({条件文档})
      • 查询,只返回第一个;
    • db.集合名称.find({条件文档}).pretty()
      • 方法pretty():将结果格式化

    查询的条件

    • 比较运算符:
      • 等于:默认是等于判断,没有运算符;
      • 小于:$lt
      • 小于或等于:$lt
      • 大于:$gt
      • 大于或等于:$gte
      • 不等于:$ne
    例子:
        查询年龄大于或等于18的学生
            db.stu.find({age:{$gte:18}})
    
    • 逻辑运算符:
      • 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接;
      • 逻辑与:默认是逻辑与的关系;
      • 逻辑或:$or;
      • and和or一起使用;
    例子:
        查询年龄大于18或性别为0的学生,并且学生的姓名为gj
            db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
    
    • 范围运算符
      • 在范围内,$in;
      • 不在范围内,$nin;
    例子:
        查询年龄为18、28的学生
            db.stu.find({age:{$in:[18,28]}})
    
    • 正则表达式
      • /正则表达式/
      • $regex:'正则表达式'
    例子:
        查询姓黄的学生
            db.stu.find({name:/^黄/})
            db.stu.find({name:{$regex:'^黄'}}})
    
    • 自定义函数查询
      • 使用$where后面写一个函数,返回满足条件的数据;
    例子:
        查询年龄大于30的学生
            db.stu.find({$where:function(){return this.age>20}})
    

    高级条件

    1 limit 和 skip
    • limit()
      • 用于读取指定数量的文档;
      • db.集合名称.find().limit(NUMBER)
        • 参数NUMBER表示要获取文档的条数;
        • 如果没有指定参数则显示集合中的所有文档;
    • skip()
      • 用于跳过指定数量的文档
      • db.集合名称.find().skip(NUMBER)
        • 参数NUMBER表示跳过的记录条数,默认值为0;
    • 方法limit()和skip()可以一起使用,不分先后顺序;
      • 查询第5至8条数据:
        • db.stu.find().limit(4).skip(5)
        • db.stu.find().skip(5).limit(4)
    2 投影
    • 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段;
      • db.集合名称.find({},{字段名称:1,...})
        • 参数为字段与值,值为1表示显示,值为0不显示
    例子:
        db.stu.find({},{name:1,gender:1})
        db.stu.find({},{_id:0,name:1,gender:1})
    
    3 排序
    • 方法sort(),用于对结果集进行排序;
      • db.集合名称.find().sort({字段:1,...})
        • 参数1为升序排列,参数-1为降序排列;
    例子:
        根据性别降序,再根据年龄升序
            db.stu.find().sort({gender:-1,age:1})
    
    4 统计个数
    • 方法count(),统计数据个数
      • db.集合名称.find.count({条件})
    5 消除重复
    • 方法distinct(),对数据进行去重
      • db.集合名称.distinct('去重字段',{条件})
    例子:
        查找年龄大于18的性别(去重)
            db.stu.distinct('gender',{age:{$gt:18}})
    

    4 高级操作

    相关文章

      网友评论

          本文标题:MongoDB

          本文链接:https://www.haomeiwen.com/subject/vitirhtx.html