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