NoSQL系列之MongoDB

1.介绍

1.1 NoSQL

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。

2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论[2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。

  • RDBMS vs NoSQL

    RDBMS
    - 高度组织化结构化数据
    - 结构化查询语言(SQL) (SQL)
    - 数据和关系都存储在单独的表中。
    - 数据操纵语言,数据定义语言
    - 严格的一致性
    - 基础事务

    NoSQL
    - 代表着不仅仅是SQL
    - 没有声明性查询语言
    - 没有预定义的模式
    -键 - 值对存储,列存储,文档存储,图形数据库
    - 最终一致性,而非ACID属性
    - 非结构化和不可预知的数据
    - CAP定理
    - 高性能,高可用性和可伸缩性

  • NoSQL 数据库分类

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

1.2 MongoDB

  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

2 安装与使用MongoDB

地址为:https://www.mongodb.com/download-center#community。MonggoDB支持以下平台:

  • OS X 32-bit
  • OS X 64-bit
  • Linux 32-bit
  • Linux 64-bit
  • Windows 32-bit
  • Windows 64-bit
  • Solaris i86pc
  • Solaris 64
  • MongoDB与SQL术语
SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键
  • 下表为MongoDB中常用的几种数据类型。

    数据类型描述
    String字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
    Integer整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
    Boolean布尔值。用于存储布尔值(真/假)。
    Double双精度浮点值。用于存储浮点值。
    Min/Max keys将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
    Array用于将数组或列表或多个值存储为一个键。
    Timestamp时间戳。记录文档修改或添加的具体时间。
    Object用于内嵌文档。
    Null用于创建空值。
    Symbol符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
    Date日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
    Object ID对象 ID。用于创建文档的 ID。
    Binary Data二进制数据。用于存储二进制数据。
    Code代码类型。用于在文档中存储 JavaScript 代码。
    Regular expression正则表达式类型。用于存储正则表达式。

3 数据库操作

show dbs
db
use <db>
db.dropDatabase()
db.createCollection(name,options)
db.<collection>.drop()
show collections
<db>.system.*

4 数据操纵

db.<collection>.insert(doc)
db.<collection>.insertOne(doc)
db.<collection>.replaceOne(doc)
db.<collection>.insertMany(doc)
db.<collection>.save(doc)
db.<collection>.update({condition},{$set:{key:value}},{multi:true})
db.<coillection>.remove({condition},{justOne:false})

_id字段存储primary key,可以指定,若未指定则系统生成。

5 数据查询

db.<collection>.find()
db.<collection>.find().pretty
db.<collection>.find({selection})
db.<collection>.find({selection}).sort()
db.<collection>.find({selection},{projection})

5.1 比较运算符(选择)

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作selection格式范例RDBMS中的语句

5.2 逻辑运算符(选择)

  • AND(,)

    db.col.find({key1:value1, key2:value2}).pretty()
    
  • OR($or)

    db.col.find(
       {
          $or: [
             {key1: value1}, {key2:value2}
          ]
       }
    )
    

5.3 投影

db.<collection>.find({},{key1:1,_id:0})

投影字段1为投影,0为取消。

5.4 排序

db.<collection>.find().sort(key1:1/-1,key2:1/-1,...)

1为升序,-1为降序。

5.5 聚合/分组

db.<collection>.aggregate([{$agg:{}},{},...}])

下表展示了一些聚合的表达式:

表达式描述实例
$sum计算总和。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}])
$avg计算平均值db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}])
$min获取集合中所有文档对应值得最小值。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}])
$max获取集合中所有文档对应值得最大值。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}])
$push在结果文档中插入值到一个数组中。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}])
$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}])

  • 管道的概念

    管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

    MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

    表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。_id指定分组的字段,若全部分为一组则用null.
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

2020.8.14

Notice

觉得本文对你有帮助的话,欢迎点赞转发!有任何学术上的问题也欢迎与小幸一起探讨!小幸创建了一个QQ群,方便大家学习交流,群内也会经常分享一下学习资源。有兴趣的小伙伴可以加群哦!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值