一、MongoDB简介

MongoDB是一款强大、灵活、且易于扩展的通用型数据库

1)易用性

MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,
面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。
通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。
另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。由于没有固定的模式,
根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。
View Code

2)易扩展性

应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。
由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且
当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,以及将
用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送
View Code

3)功能丰富

MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能
#1、索引
支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引

#2、聚合
支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化

#3、特殊的集合类型
支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志

#4、文件存储
支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现
View Code

4)性能好

MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。
只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一
View Code

二、MongoDB基础知识

1)文档是MongoDB的核心概念。文档就是键值对的一个有序集{'msg':'hello','foo':3}。类似于python中的有序字典。

需要注意的是:
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:
#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义,只有在特定环境下才能使用。
#3、以下划线"_"开头的键是保留的(不是严格要求的)。
View Code

2)集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表

#1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构,这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。

#2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。
在MongoDB中,使用子集合来组织数据非常高效,值得推荐

#3、当第一个文档插入时,集合就会被创建。合法的集合名:
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
View Code

3)数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:
#1、不能是空字符串("")。
#2、不得含有' '(空格)、.、$、/、\和\0 (空字符)。
#3、应全部小写。
#4、最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
#1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时,分片信息会存储在config数据库中
View Code

4)强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间

例如:
如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是
cmd.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节

三、windows下安装

1)官网下载。https://www.mongodb.com/

 2)下载好了安装包直接下一步就可以了

  然后添加好环境变量即可

 四、centos6环境下安装

1)官网下载相应的版本

2)安装方法

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.0.1.tgz
tar -xvf mongodb-linux-x86_64-rhel62-4.0.1.tgz
mv mongodb-linux-x86_64-rhel62-4.0.1 /usr/local/mongodb
mkdir -p /data/mongo/data
mkdir -p touch /data/monogo
touch /data/monogo/dblogs
/usr/local/mongodb/bin/mongod --dbpath=/data/mongo/data --logpath=/data/mongo/dblogs --logappend --fork   # 后台执行
echo /usr/local/mongodb/bin/mongod --dbpath=/data/mongo/data --logpath=/data/mongo/dblogs--logappend --fork >>/etc/rc.local   # 开机自启动

3)启动客户端:/usr/local/mongodb/bin/mongo

[root@mysql bin]# /usr/local/mongodb/bin/mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
Server has startup warnings: 
2018-12-04T07:42:32.589+0800 I STORAGE  [initandlisten] 
2018-12-04T07:42:32.589+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-12-04T07:42:32.589+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server. 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-12-04T07:42:33.173+0800 I CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> 
View Code

 五、MongoDB的基本使用

1)创建用户过程(管理员)在admin库下

> 
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> use admin
switched to db admin
> db
admin
> db.createUser(
...   {
...     user: "root",
...     pwd: "123",
...     roles: [ { role: "root", db: "admin" } ]
...   }
... )
Successfully added user: {
    "user" : "root",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}
> 
> 
View Code

创建账号的命令

use admin
db.createUser(
  {
    user: "root",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
  }
)
View Code

 2)验证有数据才显示是否有库,或者集合(表)

> db
db1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db.user.insert({"_id":1,"name":"dasb"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
db1     0.000GB
local   0.000GB
View Code

 创建普通用户

> db.createUser(
...   {
...     user: "egon",
...     pwd: "123",
...     roles: [ { role: "readWrite", db: "test" },
...              { role: "read", db: "db1" } ]
...   }
... )
Successfully added user: {
    "user" : "egon",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        },
        {
            "role" : "read",
            "db" : "db1"
        }
    ]
}
> 
执行过程

创建账号的命令

db.createUser(
  {
    user: "egon",
    pwd: "123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "db1" } ]
  }
)
View Code

> exit  # 退出

3)创建账号后,重启服务。加载auth权限启动

[root@mysql bin]# killall -9 mongodb
mongodb: no process killed
[root@mysql bin]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1145/sshd
tcp        0      0 127.0.0.1:27017             0.0.0.0:*                   LISTEN      29032/mongod
[root@mysql bin]# killall -9 mongod
[root@mysql bin]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1145/sshd
[root@mysql bin]# /usr/local/mongodb/bin/mongod --dbpath=/data/mongo/data --logpath=/data/mongo/dblogs --logappend --auth --fork
[root@mysql bin]# /usr/local/mongodb/bin/mongo      # 虽然进来了,但没有权限
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> db
test
> db.auth("root","123")
Error: Authentication failed.
0
> use admin
switched to db admin
> db.auth("root","123")     # 账号创建给哪个库,就在哪个库下面执行才有效
1
> show dbs
admin   0.000GB
config  0.000GB
db1     0.000GB
local   0.000GB
[root@mysql bin]# /usr/local/mongodb/bin/mongo -u "root" -p "123"  --authenticationDatabase "admin"  直接登录
/usr/local/mongodb/bin/mongo --port 27017 -u "root" -p "123"  --authenticationDatabase "admin"      # 指定端口登录
/usr/local/mongodb/bin/mongo --port 27017  -host 127.0.0.1 -u "root" -p "123"  --authenticationDatabase "admin"         # 完整。IP,端口,用户,密码,库
View Code

 六、可视化工具。https://robomongo.org/

 

posted on 2018-12-23 16:52  可口_可乐  阅读(915)  评论(0)    收藏  举报