在Ubuntu 16.04上安装MongoDB(Xenial)
在本数据库教程中,我们将一步步指导您在Ubuntu 16.04上安装MongoDB,然后再介绍MongoDB一些基本特性和功能。
MongoDB是一个数据库引擎。它主要用于对非关系型数据库,面向文档的数据库的访问。就像Redis和Cassandra等数据库那样,它是不断壮大的NoSQL运动的一份子(尽管许多非关系型数据库之间也存在着巨大差异)。
MongoDB旨在提供一种对传统关系数据库管理系统(RDBMS)的替代方案。除了无架构设计和可扩展架构外,MongoDB还提供JSON输出和专门的特定语言绑定功能,使其特别适用于自定义应用程序开发和快速原型设计。MongoDB是目前所有系统中最流行的数据库引擎之一,它已经在许多大规模生产中被部署应用。
由于MongoDB可能需要大量RAM,因此我们推荐在本教程中使用高内存Linode。(译者注:不需要用原文推荐的VPS)
准备工作
- 熟悉我们的入门指南并完成设置Linode主机名和时区的步骤。
- 完成“ 保护您的服务器 ”部分以创建标准用户帐户,使用强度更大的SSH访问(译者推测这里指的是设置强密码)并删除不必要的网络服务。
- 使用如下命令更新您的系统:
sudo apt-get update && sudo apt-get upgrade
注意本指南是为非root用户编写的。需要提升权限的命令会带有前缀
sudo
。如果您不熟悉sudo
命令,可以查看我们的“ 用户和组”指南。
添加MongoDB存储库
mongodb-server
在Ubuntu包存储库中有2.6版。但是,此版本于2016年10月到期,因此不应在生产环境中使用。可用的最新版本是3.2,在撰写本文时,默认的Ubuntu存储库不包含更新的软件包。
由于以上原因,我们得使用MongoDB存储库。
- 导入MongoDB公共GPG密钥以进行包签名:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
- 将MongoDB存储库添加到
sources.list.d
目录:echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
- 使用
sudo apt-get update
更新存储库。这将使apt
从新添加的MongoDB repo中读取:
安装MongoDB
现在已经添加了MongoDB存储库,我们已准备好安装最新的稳定版MongoDB:
sudo apt-get install mongodb-org
此命令将安装mongodb-org
基础包,其中包含以下内容:
-
mongodb-org-server
- 标准的MongoDB守护程序,以及相关的初始化脚本和配置 -
mongodb-org-mongos
- MongoDB Shard守护进程 -
mongodb-org-shell
- MongoDB shell,用于通过命令行与MongoDB交互 -
mongodb-org-tools
- 包含一些用于恢复,导入和导出数据以及各种其他功能的基本工具。
这些软件包构建了一个良好的基础,基本可以满足大多数用例,我们建议您全部安装。但是,如果您希望少安装点,可以从上面的列表中选择性地安装某个软件包,而不是使用mongodb-org
包。
有关安装过程和选项的更多信息,请参阅MongoDB官方安装教程。
配置MongoDB
MongoDB的配置文件位于/etc/mongod.conf
,并以YAML格式编写。大多数设置都附带了注释。我们概述了以下默认选项:
-
dbPath
是数据库文件的存储位置(默认情况是/var/lib/mongodb
) -
systemLog
指定各种日志记录选项,解释如下:-
destination
告诉MongoDB是将日志输出存储为文件还是syslog -
logAppend
指定守护程序重新启动时是否将新条目附加到现有日志的末尾(追加)而不是创建备份并在重新启动时启动新日志(创建) -
path
告诉守护进程在哪里存放其日志信息(默认情况是/var/log/mongodb/mongod.log
)
-
-
net
指定各种网络选项,解释如下:-
port
是MongoDB守护程序将运行的端口 -
bindIP
指定绑定的MongoDB的IP地址,可以监听来自其他应用程序的连接请求
-
这些只是几个基本的默认配置选项。
我们强烈建议注释掉(而不是删除)/etc/mongod.conf
文件的security
部分并添加以下内容:
1 2 |
security: authorization: enabled |
---|
该authorization
选项为您的数据库启用基于角色的访问控制。如果未指定任何值,任何用户都可以修改任何数据库。我们将在本教程的后面讲解如何创建数据库用户并设置其权限。
有关如何 在配置文件中自定义这些值和其他值的更多信息,请参阅MongoDB官方配置教程。
配置文件改完后,重新启动该服务,如以下部分所示。
启动和停止MongoDB
如果想启动,重新启动或停止MongoDB服务,请使用以下命令:
sudo systemctl start mongod
sudo systemctl restart mongod
sudo systemctl stop mongod
当然也可以在系统启动时开启MongoDB:
sudo systemctl enable mongod
创建数据库用户
如果在 "配置MongoDB" 部分中启用了基于角色的访问控制,请创建一个用户管理员,其中包含用于数据库认证的凭据:
- 打开
mongo
shell:mongo
- 默认情况下,MongoDB会连接到一个名为
test
的数据库。在添加任何用户之前,创建一个数据库来存储用户数据以进行身份验证use admin
- 使用以下命令创建管理员,该用户可以在任何数据库上创建其他用户。为了更好的安全性,记得更改
mongo-admin
和password
值:db.createUser({user: "mongo-admin", pwd: "password", roles:{role: "userAdminAnyDatabase", db: "admin"}})
将这些凭证保存在安全的地方,以备将来所用。输出将显示写入数据库的所有信息(不包含密码):Successfully added user: { "user" : "mongo-admin", "roles" : { "role" : "userAdminAnyDatabase", "db" : "admin" } }
- 退出mongo shell:
quit()
- 使用在步骤3中创建的凭据,测试与MongoDB的连接,使用
admin
数据库进行身份验证:mongo -u mongo-admin -p --authenticationDatabase admin
上面的命令选项中的-u
,-p
和--authenticationDatabase
是必需的,用来验证到外壳的连接。如果没有身份验证,虽然可以访问MongoDB shell,但不允许连接到数据库。 在步骤3中创建的用户mongo-admin
纯粹基于指定的角色来进行管理。它被定义为所有数据库的管理员,但本身没有任何数据库权限。您可以使用它来创建其他用户并定义他们的角色。如果用MongoDB完成多个应用程序,请为其相应的数据库设置具有自定义权限的不同用户。 - 作为
mongo-admin
用户,创建一个新数据库来存储常规用户身份数据以进行身份验证。以下示例是调用user-data
数据库:use user-data
- 不同数据库的权限在单独的
roles
对象中处理。此示例中使用的example-user
对user-data
数据库具有只读权限,但对下面的“数据集合管理”部分中创建的数据库exampleDB
有读写权限。 创建一个新的非管理员账户以输入测试数据。修改example-user
和password
相关确保更安全:db.createUser({user: "example-user", pwd: "password", roles:{role: "read", db: "user-data"}, {role:"readWrite", db: "exampleDB"}})
要创建其他用户,请重复6和7中的步骤作为管理用户,通过替换适当的值来创建新的用户名,密码和角色。 - 退出mongo shell:
quit()
有关访问控制和用户管理的更多信息,以及数据库安全的其他提示,请参阅MongoDB安全文档。
数据集合管理
MongoDB因易集成而受到人们的喜爱。它与数据库的交互是调用JavaScript方法完成的,但也可以选择其他语言的驱动程序。本节将演示其中一些基本功能,建议您根据以下用例做进一步研究。
- 使用之前创建的
example-user
打开MongoDB shell :mongo -u example-user -p --authenticationDatabase user-data
- 创建一个新数据库。不妨叫它
exampleDB
:use exampleDB
确保此数据库具有读写权限(我们在上一部分的步骤7中添加的权限)。 要显示当前工作数据库的名称,请运行db
命令。 - 创建一个新集合
exampleCollection
:db.createCollection("exampleCollection", {capped: false})
不熟悉MongoDB术语的话,可以把集合看做DBMS中的表。更多信息,请参阅db.createCollection()方法上的MongoDB文档。 注意集合名称不应包含连字符之类的标点符号。运气好的话,在尝试使用或修改集合之前,这可能不会引发异常。更多有关信息,请参阅MongoDB的命名限制。 - 创建用于进入测试数据库的样本数据。如下所示,MongoDB 以JSON对象的形式接收输入作为文档。a和b变量用于简化事项; 对象也可以通过函数直接插入。
var a = { name : "John Doe", attributes: { age : 30, address : "123 Main St", phone : 8675309 }} var b = { name : "Jane Doe", attributes: { age : 29, address : "321 Main Rd", favorites : { food : "Spaghetti", animal : "Dog" } }}
__ 插入到集合中的文档不需要具有相同的schema,这是使用NoSQL数据库的好处之一。 - 用
insert
方法将数据插入exampleCollection
:db.exampleCollection.insert(a) db.exampleCollection.insert(b)
每个操作的输出将显示当前工作数据库写入的对象数:WriteResult({ "nInserted" : 1 })
- 确认
exampleCollection
已正确创建:show collections
输出将列出包含当前工作数据库中数据的所有集合:exampleCollection
- 在
exampleCollection
里使用find
方法查看集合中未过滤的数据。不指定查询的话,默认返回集合中的前20个文档:db.exampleCollection.find()
输出将类似于以下内容:{ "_id" : ObjectId("571a3e7507d0fcd78baef08f"), "name" : "John Doe" } { "_id" : ObjectId("571a3e8707d0fcd78baef090"), "age" : 30 }
您可能会注意到我们输入的对象前面有_id
键和对应的ObjectId
值。这些是MongoDB在_id
未明确定义值时生成的唯一索引。查询时,ObjectId
的值被用作主键,但为了方便,您会希望像其他数据库系统一样创建自己的索引。 该find
方法还可以用于通过输入搜索项参数(以对象的形式)来搜索特定文档或字段,而不是将其留空。例如:db.exampleCollection.find({"name" : "John Doe"})
运行上面的命令将返回包含该{"name" : "John Doe"}
对象的文档列表。
额外功能
如上所述,MongoDB有一组特定语言的驱动程序,可用在非JavaScript程序中与数据库交互。这些驱动程序的优点是允许使用不同语言的程序调用相同的数据库,而不需要对象数据映射器(ODM)。但是,如果您确实想使用ODM,则可以使用许多支持良好的ODM。
在mongodb-org-tools
包中还有许多其他工具,如mongodump
,mongorestore
分别用于创建和恢复备份、快照,以及mongoimport
和mongoexport
用于从扩展JSON或受支持的CSV、TSV文件导入和导出内容。
要查看可用选项或如何使用特定方法,请附加.help()
到命令的末尾。例如,要查看find
,即步骤6中方法的选项列表:
db.exampleCollection.find().help()
更多信息
你会需要以下这些资源完善知识网络,但注意我们不能保证这些资料的准确性与实时性。
- 通过自定义ServiceHost实现对WCF的扩展[原理篇]
- python使用rsa库做公钥解密(网上别处找不到)
- 通过“四大行为”对WCF的扩展[原理篇]
- WCF客户端运行时架构体系详解[下篇]
- WCF客户端运行时架构体系详解[上篇]
- WCF服务端运行时架构体系详解[续篇]
- [WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
- [WCF-Discovery]服务如何能被”发现”
- 我的数据访问函数库的源代码(一)—— 共用部分
- 《WCF服务编程》关于“队列服务”一个值得商榷的地方
- 我的数据访问函数库的源代码(二)—— SQL语句部分
- 来源于WCF的设计模式:可扩展对象模式[上篇]
- 我的数据访问函数库的源代码(三)——返回结构数组
- 我的数据访问函数库的源代码(四)—— 存储过程部分,包括存储过程的参数的封装
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java 虚拟机基础原理:功能,内存管理,类的加载机制,分析字节码执行过程
- Stack有性能问题?推荐用ArrayDeque队列!队列是什么?什么是双端队列、延迟系列、阻塞队列,全是知识盲区!
- 纯CSS实现照片墙效果
- Tungsten Fabric知识库丨构建、安装与公有云部署
- 7. Pandas系列 - 排序和字符串处理
- JVM调优,程序员必须掌握的知识
- 5分钟Flink - 侧输出流(SideOutput)
- 数据库技术:MySQL 基础和 SQL 入门,单表、约束和事务
- ConcurrentHashMap的size方法是线程安全的吗?
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)
- 数据库技术:MySQL 多表,外键约束,数据库设计,索引,视图,存储过程触发器,数据控制,数据备份与恢复
- WordPress 站点地址被恶意篡改的防护方案讨论
- 握草,你竟然在代码里下毒!
- MySQL 练习题和答案,以及运行结果截图
- 给你一个优秀的Django工程模板