循序渐进MongoDB V3.4(Ubuntu)
MongoDB是一个跨平台、开源、面向文档的数据库。它具备高性能、高可用性和易于扩展的特性。学习MongoDB要特别关注以下几个概念:
- Database它是集合(Collections)的容器。
- Collection它是MongoDB文档(documents)的一个组。
- Document它是一组键值对(a set of key-value pairs)。
从安装开始:
安装
安装之前我们需要导入MongoDB GPG key:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
导入MongoDB repository:
$ echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list $ sudo apt-get update
可以安装了,因是目前最新的3.4所以可能要加“--allow-unauthenticated”选项:
// 先用下面的命令,如果要求 --allow-unauthenticated 就转到下一个命令
$ sudo apt-get install -y mongodb-org
// 根据提示可以使用下面这个命令
$ sudo apt-get install -y mongodb-org --allow-unauthenticated
这是一个漫长的过程,以我200M光纤的速度还是花了两小时。
完成安装后通过如下命令修改MongoDB的服务文件:
$ cd /lib/systemd/system $ sudo nano mongod.service
并确保文件是以下内容:
[Unit] Description=High-performance, schema-free document-oriented database After=network.target Documentation=https://docs.mongodb.org/manual [Service] User=mongodb Group=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target
退出编辑器前要保存该文件。
键入下面命令使MongoDB能够开机启动:
$ sudo systemctl start mongod $ sudo systemctl enable mongod
重新启动机器以验证安装是正确的。机器启动后键入下面命令,如果进入MongoDB控制台(看到控制台“>”符号)就说明安装成功了:
$ mongo
在MongoDB控制台键入下面命令:
> use admin > db.createUser({user:"admin", pwd:"admin123", roles:[{role:"root", db:"admin"}]})
> exit
修改mongod.service并加入认证选项:
$ cd /lib/systemd/system $ sudo nano mongod.service
修改文件第9行为如下内容:
ExecStart=/usr/bin/mongod --quiet --auth --config /etc/mongod.conf
保存并退出。
执行下面命令重起MongoDB:
$ sudo systemctl daemon-reload $ sudo service mongod restart
安装成功,现在可以用设定的用户及密码登录控制台了:
$ mongo -u admin -p admin123 --authenticationDatabase admin
进入MongoDB控制台,畅游其中之前需要了解以下几个简单的命令:
- help 根级别帮助
- db.version() 列表当前MongoDB的版本
- db.stats() 列表当前数据库(database)的状态
- db.help() 列表DB当前的方法
- show dbs 列表当前的可用的数据库(database)
- db 列表当前在用的数据库(database)
- show collections 列表当前数据库的可用集合
热个身吧:
> db.version() 3.4.10 > db.stats() { "db" : "test", "collections" : 0, "views" : 0, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 0, "numExtents" : 0, "indexes" : 0, "indexSize" : 0, "fileSize" : 0, "ok" : 1 } > show dbs admin 0.000GB local 0.000GB > db test > show collections
为节省篇幅db.help()就不列了,下面进入MongoDB的实践篇。
实践
MongoDB虽然与传统的关系数据库系统有很多差异,但还是可以有以下的类别:
- MongoDB是数据库容器,管理多个数据库实体,这点与关系数据库是一致的。
- 一个MongoDB数据库是集合容器,管理多个集合(collection),这里的集合概念与关系数据库中表(table)的概念是一个级别的。
- 一个集合(collection)是文档(document)容器,管理多个文档,而这个文档概念与关系表中行(row)是一个级别的概念。
- 一个文档(document)又是键值对的集合(set of key-value pairs),而每个键值对与关系表中的字段(field)是一个级别的概念。
- 同一关系表(table)中,不同的行有完全相同的数据字段定义,他们存储完全相似的数据;而MongoDb集合(collection)中的文档(document)它们可以有完全不同的数据定义,无论是数据类型和键值对个数都可以不同。这三MongoDB和关系数据库最显著的区别之一。
下图表现了关系表与MongoDB的Collection之间的区别:
通过类比我们对MongoDB已经有了一个清晰的概念,下面继续MongoDB Step by Step。
创建、删除数据库(Database)
// 语法:use <db name>
// 下面语句,如果mydb存在则选择它为当前数据库;
// 否则,创建一个名为mydb的数据库并选择它
> use mydb switched to db mydb
// 语法:db.dropDatabase()
// 下面语句删除当前数据,删除前注意选择当前库
> use mydb
switched to db mydb
> db.dropDatabase()
{ "ok" : 1}
指定数据库中创建、删除集合 (Collection)
> use mydb // 语法:db.createCollection(<collection>[, {options}]) > db.createCollection("Books")
// 列表当前db的集合
> show collections
Books
// 语法:db.<collection>.drop()
// 返回 true 成功
> db.Books.drop()
true
集合(Collection)中插入(insert)文档(Document)
// 语法:db.<collection>.insert(<{document}>) // <document> JSON format data
// 返回插入状态 > db.Books.insert({"title": "JavaScript"})
WriteResult({"nInserted" : 1})
// Mongo console "enter" new line
> db.Books.insert({
"title": "Thinking in Java",
"price": 60
})
// 此例中插入的文档有不同的结构
> db.Books.insert({
"title": "Java EE",
"subtitle": "6th Edition",
"price": 99
})
// 列表插入的文档
// 语法:db.<collection>.find([{options}]) 或 db.<collection>.find([{options}]).pretty()
> db.Books.find()
{ "_id" : ObjectId("5a02c8fe850ae434e394bc09"), "title" : "JavaScript" }
{ "_id" : ObjectId("5a02c93b850ae434e394bc0a"), "title" : "Thinking in Java", "price" : 59 }
{ "_id" : ObjectId("5a02d0a2850ae434e394bc0c"), "title" : "Java EE", "subtitle" : "6th Edition", "price" : 99 }
集合(collection)中更新(update)文档(document)
// 语法:db.<collection>.update(<{codition}>, <{update}>)
> db.Books.update(
{
"_id": ObjectId("5a02d0a2850ae434e394bc0c")
},
{
$set:
{
"price": 100
}
}
)