本篇文章依旧以腾讯云+CentOS 为例,可以参考这篇文章安装其他服务:CentOS 搭建 LNMP 环境 。在开始之前,有必要了解下数据库的类型:关系型数据库(Relational databases)和 非关系型数据库/文档型数据库(NoSQL databases):


1、关系型数据库主要代表:SQL Server、Oracle、MySQL (开源)、PostgreSQL (开源);非关系型数据库主要代表:MongoDB,Redis,CouchDB。

2、关系型数据库最典型的数据结构是表格,文档性数据库最典型的数据结构是文档。

3、SQL 数据存在特定结构的中;而 NoSQL 则更加灵活和可扩展,存储方式可以是 JSON文档哈希表或者其他方式

4、在 SQL 中,必须定义好表和字段结构后才能添加数据;在 NoSQL 中,数据可以在任何时候任何地方添加,不需要先定义表。

5、SQL 中不允许删除已经被使用的外部数据;而 NoSQL 中则没有这种强耦合的概念,可以随时删除任何数据。



安装过程

1、添加 MongoDB 的源:

mongodb-org 这个包默认不存在 CentOS 的源里,所以要先添加到我们服务器中:

$ sudo vi /etc/yum.repos.d/mongodb-org.repo


然后访问 Install on Red Hat 找到最新的 MongoDB 稳定版本并添加到上面打开的文档中,类似这样:

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc


编辑并保存文件,查看服务器源列表中是否已添加成功(留意 mongodb-org-3.2....):

$ yum repolist 

# 输出一般如下
. . .
repo id                          repo name
base/7/x86_64                    CentOS-7 - Base
extras/7/x86_64                  CentOS-7 - Extras
mongodb-org-3.2/7/x86_64         MongoDB Repository
updates/7/x86_64                 CentOS-7 - Updates
. . .


2、安装 MongoDB:

$ sudo yum install mongodb-org


3、启动 MongoDB:

$ sudo systemctl start mongod


如有需要重新解析改动后的 /etc/mongod.conf 配置文件,可以执行:

$ sudo systemctl reload mongod


4、因为 systemctl 并不返回启动结果,所以可以通过以下命令查看是否启动:

$ sudo tail /var/log/mongodb/mongod.log


查找是否包含该日志,若出现则表示服务已启动,可以通过 mongo 来开启命令:

. . .
[initandlisten] waiting for connections on port 27017


5、开机自启动

首先查看是否已启用:

$ systemctl is-enabled mongod; echo $?


# 查看输出是否包含 enabled 字样
. . .
enabled
0


若无,可以手动启动:

$ sudo systemctl enable mongod


6、导入 example 数据

不像 MySQL,MongoDB 安装后并没有一个 test 数据库供测试,我们可以导入一个示例项目,通过下列方式:

$ cd /tmp
$ curl -LO https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
$ mongoimport --db test --collection restaurants --file /tmp/primer-dataset.json

# 输出:
connected to: localhost
imported 25359 documents


查看数据:

$ mongo
$ db.restaurants.find().limit(1).pretty()

# 输出
{
    "_id" : ObjectId("57e0443b46af7966d1c8fa68"),
    "address" : {
        "building" : "1007",
        "coord" : [
            -73.856077,
            40.848447
        ],
        "street" : "Morris Park Ave",
        "zipcode" : "10462"
    },
    "borough" : "Bronx",
    "cuisine" : "Bakery",
    "grades" : [
        {
            "date" : ISODate("2014-03-03T00:00:00Z"),
            "grade" : "A",
            "score" : 2
        },
        {
            "date" : ISODate("2013-09-11T00:00:00Z"),
            "grade" : "A",
            "score" : 6
        },
        {
            "date" : ISODate("2013-01-24T00:00:00Z"),
            "grade" : "A",
            "score" : 10
        },
        {
            "date" : ISODate("2011-11-23T00:00:00Z"),
            "grade" : "A",
            "score" : 9
        },
        {
            "date" : ISODate("2011-03-10T00:00:00Z"),
            "grade" : "B",
            "score" : 14
        }
    ],
    "name" : "Morris Park Bake Shop",
    "restaurant_id" : "30075445"
}


删除数据库:

$ db.restaurants.drop()


数据库操作

1、添加数据库用户

$ mongo --port 27017
$ use admin
$ db.createUser(
   {
     user: "root",
     pwd: "xxxxxx",
     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  })

# 现在我们为 MongoDB 的 admin 数据库添加一个用户 root,MongoDB 可以为每个数据库
# 都建立权限认证,也就是你可以指定某个用户可以登录到哪个数据库。上面的代码,我们为
# admin 数据库添加了一个 root 用户,在 MongoDB 中 admin 数据库是一个特别的数据库,
# 这个数据库的用户,可以访问 Mongodb 中的所有数据库。


2、用户登录

# 方式一
$ mongo --port 27017 -u "root" -p "xxxxxx" --authenticationDatabase "admin"

# 方式二
$ mongo --port 27017
$ use admin
$ db.auth("root", "xxxxxx")

// 输出 1 表示验证成功,并且不会报错了


3、账户相关操作:

# 查询某个数据库下用户(每个数据库的用户账号都是以文档形式存储在 system.users 集合里面的)
$ db.system.users.find()

# 删除某个数据库下的所有用户
$ db.system.users.remove()

# 删除指定用户
$ db.system.users.remove({'user':'用户名'})

# 修改账户密码
db.changeUserPassword("username", "newpassword")


4、数据库操作

$ mongo --port 27017
$ use admin
$ db.auth("root", "xxxxxx")

$ show dbs         # 查看数据库
$ use <db name>    # 选择数据库

$ show collections           # 查看 collections
$ db.collectionName.find()   # 查看 documents

$ use <db name>     # 创建数据库
$ db.test.insert({"name":"tutorials point"})    # 随便插入点数据(才能出现)


5、数据的导入与导出

# mongoexport导出表,或者表中部分字段(一般可以简写)
$ mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --csv -q 条件 -f 字段 -o newdbexport.json/dat/csv

-h:数据库宿主机的IP
-u:数据库用户名
-p:数据库密码
-d:数据库名字
-c:集合的名字
-f:导出的列名
-q:导出数据的过滤条件
-o:导出文件的目录及文件名(/xx/xx/xx.json)
--type:json 或 csv(默认是 json)

比如导出整张表:
$ mongoexport -d test -c users -o allusers.dat

比如导出部分字段:
$ mongoexport -d test -c users --csv -f uid,name,sex -o test/users.csv

比如根据条件敢出数据:
$ mongoexport -d test -c users -q '{uid:{$gt:1}}' -o test/users.json 


# mongoimport 导入表,或者表中部分字段
$ mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名

比如还原导出的表数据(--upsert 插入或者更新现有数据)
$ mongoimport -d test -c users --upsert test/users.dat

比如部分字段的表数据导入(--upsertFields根--upsert一样)
$ mongoimport -d test -c users --upsertFields uid,name,sex test/users.dat

比如还原csv文件
$ mongoimport -d test -c users --type csv --headerline --file test/users.csv  


# mongodump 备份数据库(如果想导出所有数据库,可以去掉-d)
$ mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径

比如:
$ mongodump -h 127.0.0.1 -p 30216 -d test -uxxxx -pxxxxx -o home/mongodb/


# mongorestore 还原数据库
$ mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径

比如:
$ mongorestore -d test /home/mongodb/test


相关链接:

man mask