0%

MongoDB基础知识及使用

MongoDB是什么

  • MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB的特点——高性能、易部署、易使用

  • 面向集合存储,易存储对象类型的数据。

  • 模式自由。

  • 支持动态查询。

  • 支持完全索引,包含内部对象。

  • 支持查询。

  • 支持复制和故障恢复。

  • 使用高效的二进制数据存储,包括大型对象(如视频等)。

  • 自动处理碎片,以支持云计算层次的扩展性

  • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

  • 文件存储格式为BSON(一种JSON的扩展)。

  • 可通过网络访问。

MongoDB适用场景

MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起

Mongo 适用于以下场景:

  • 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

  • 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。

  • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。

  • 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。

  • 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

MongoDB 的使用也会有一些限制,例如,它不适合于以下几个地方。

  • 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

  • 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

  • 需要SQL 的问题。

基础知识

  1. MongoDB中的 database 有着和你熟知的”数据库”一样的概念 (对 Oracle 来说就是 schema)。一个 MongoDB 实例中,可以有零个或多个数据库,每个都作为一个高等容器,用于存储数据。
  2. 数据库中可以有零个或多个 collections (集合)。集合和传统意义上的 table 基本一致,你可以简单的把两者看成是一样的东西。
  3. 集合是由零个或多个 documents (文档)组成。同样,一个文档可以看成是一 row
  4. 文档是由零个或多个 fields (字段)组成。, 没错,它就是 columns
  5. Indexes (索引)在 MongoDB 中扮演着和它们在 RDBMS 中一样的角色。
  6. Cursors (游标)和上面的五个概念都不一样,但是它非常重要,并且经常被忽视,因此我觉得它们值得单独讨论一下。其中最重要的你要理解的一点是,游标是,当你问 MongoDB 拿数据的时候,它会给你返回一个结果集的指针而不是真正的数据,这个指针我们叫它游标,我们可以拿游标做我们想做的任何事情,比如说计数或者跨行之类的,而无需把真正的数据拖下来,在真正的数据上操作。

这些术语并不是与传统的关系型数据库完全一致,它最大的区别在于关系型数据库是在 table 上定义的columns,而面向文档数据库是在 document 上定义的 fields。也就是说,在 collection 中的每个 document 都可以有它自己独立的 fields。因此,对于 collection 来说是个简化了的 table ,但是一个 document 却比一 row 有更多的信息。

创建database和user

1
2
3
4
5
6
7
8
9
10
11
12
//当使用use后,如果数据库不存在,mongodb会默认地创建数据库,并把当前数据库转换成指定的数据库
use springbucks
//为数据库springbucks创建一个userroles表示该user属于哪些角色,这里的readWrite表示该user有读写权限
db.createUser(
{
user:"springbucks",
pwd:"springbucks",
roles:[
{role:"readWrite", db:"springbucks"}
]
}
);

其中user的文档格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
user: "<name>", //用户名
pwd: "<cleartext password>", //用户密码
customData: { <any information> }, //备注信息,可选
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
], //角色数组,授权给此用户的角色,[]表示无角色
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...]
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
], //限制数组,可选
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ], //指定用于创建SCRAM用户凭据的特定SCRAM机制,可选。3.6默认SCRAM-SHA-1
passwordDigestor: "<server|client>"
} //密码摘要,可选,指定用户端/服务器是否生成密码摘要
  • 权限说明具体角色:
    • Read:允许用户读取指定数据库
    • readWrite:允许用户读写指定数据库
    • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    • userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
    • clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
    • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
    • readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
    • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
    • root:只在admin数据库中可用。超级账号,超级权限。

自定义角色

创建角色createRole(<document>);

其中role的文档格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
role: "<name>", //角色名
privileges: [
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
], //权限数组,包括资源和权限操作 (详见附件)
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
], //父类角色数组,对于该数据库角色可直接用role字符串表示
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
] //认证限制数组,可选,确定一组可连接IP地址、CIDR范围
}

注:

  • 若一个角色继承多个限制不同的角色,如IP不同,则用户不可认证
  • 如果角色不是在admin数据库中创建的,则该用户只能设置此数据库下的权限且只能继承此数据库下角色
  • 创建角色必须有该数据库的createRole action和grantRole action,要设置新角色的authenticationRestrictions,还必须拥有此数据库的 setAuthenticationRestriction action权限
  • resource格式分三类,Database and/or Collection Resource, Cluster Resource 以及 anyResource
-------------本文结束感谢您的阅读-------------