使用MongoDB所得到的笔记
首先
我有机会使用MongoDB,但是日文的文章很少,导致在引入方面遇到了一些困难。我会将它们总结为备忘录,希望对考虑使用MongoDB的人有所帮助。
另外,这是我第一次在Qiita上发布文章,可能还有一些不足之处。如果能在评论中指出,我将不胜感激。
关于Mongo的概述
MongoDB是一种数据库管理系统
MongoDB是一种面向文档的数据库。根据DB-Engines的数据,在2017年12月份,它排名第5。目前版本为3.4,官方手册可以在此链接找到:https://docs.mongodb.com/manual/
感受
MongoDB是一种没有像关系型数据库(RDBMS)那样具有架构的数据库,所以它更加轻便,并且在聚合(类似于计数或分组)方面比NoSQL更擅长。我觉得MongoDB正在尝试汲取关系型数据库(RDBMS)和NoSQL的优点。当然,每个数据库都有其擅长和不擅长的领域,因此在根据需求和规范进行选择时是必要的。
相比关系型数据库(RDBMS),MongoDB可以实现大量的插入操作,而相比NoSQL,它在部分匹配搜索和计数上更强大。我认为MongoDB适用于不需要事务处理但需要进行聚合计算的系统,例如日志和问卷回答等。
具体的术语
集合是在RDBMS中称为表的东西。它用于管理下文提到的文档集合。它是无模式的,不需要表定义。不需要创建语句之类的东西,只需插入数据就会自动创建。
文件
它是关系数据库管理系统(RDBMS)中的记录。由于是无模式的,所以在一个集合中可以存在不同结构的文件。就像NoSQL一样插入操作也是直接使用,就是将值存储在_id键下的图像。_id可以被指定,但也可以自动分配一个唯一的键。
字段
在RDBMS中被称为列。用”列”一词可能更容易理解。然而,字段中也可能包含数组或其他字段。这是因为它是一种无模式的NoSQL数据库。
复制
也可以称为复制集 jí)。在数据库冗余配置中使用。也被称为镜像复制,可以在Mongo的配置文件中进行指定。
分片
这是数据分散的概念。可以简单地理解为类似RAID 0的概念。在Mongo的配置文件中也可以进行指定。
引入
将CentOS7安装
我使用了Sakura VPS来进行操作,并在其中记录了CentOS7安装MongoDB的步骤。关于安装步骤,我参考了官方文档:>https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
这次我们将安装MongoDB3.4版本。首先需要将其添加到yum仓库中。
# /etc/yum.repos.d/mongodb-org-3.4.repo
[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
接下来使用yum进行安装并启动。
# yum安装 -y mongodb-org
# systemctl启动mongod
一旦启动,您就可以立即在Mongo中使用它。
设置认证
默认设置只允许从本地主机访问,但可以无需进行身份验证访问。身份验证设置将参考官方文档:https://docs.mongodb.com/manual/tutorial/enable-authentication/。
首先创建一个用户。请适当更改用户名和密码。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
下一步是修改conf文件。默认设置下,security被注释掉了,因此需要取消注释并启用authorization。
# vi /etc/mongod.conf
security:
authorization: enabled
请使用`bindIp`命令来重新启动`mongod`,以确保无法进行未经身份验证的访问。如果需要对IP地址进行限制,请在`bindIp`中指定。
bindIp: 127.0.0.1
# 执行以下操作:重新启动Mongo,并确认能够登录。
# systemctl start mongod
# mongo admin -u myUserAdmin -p
使用托管服务
我已经记录了在CentOS上进行on-premise构建的方法,但我认为如果只是个人试用的话,Saas比较好。在on-premise环境中进行故障排除可以增加技术知识,但大多数人只需要学会如何使用Mongo,就已经足够了。
因此,我要介绍MongoDB Atlas。虽然需要免费注册,但一旦注册,您就可以在免费计划下使用一个Mongo服务器。这是一个足够好的环境供您试用,我推荐您使用它。>https://www.mongodb.com/cloud
客户工具 (kè hù jù)
Robo 3T(羅博三提)
對於使用MongoDB,您可能會想要以GUI方式查看內容。不僅限於Mongo,我認為使用GUI可以更容易地獲得操作的起點。
有許多用於Mongo的客戶端工具,但我使用Robo 3T。它的使用方法很簡單,但連接驗證可能有一點難以理解。>https://robomongo.org/
基本操作 – 基本的操作步骤
以下是从控制台输入的基本命令备忘录。按顺序依次是显示数据库列表、切换数据库、显示集合列表。
> show dbs
> use admin
> show collections
这只是基本的CRUD操作示例,还有其他各种方法可供使用。详见:https://docs.mongodb.com/v3.4/reference/method/js-collection/
创建
下面是创建文档(记录)的步骤。>https://docs.mongodb.com/v3.4/reference/method/db.collection.insert/
由于Mongo是无模式的,所以不需要预先创建集合(表)。对于数据库也是如此,即使没有预先创建数据库,它在插入时也会自动创建。
本次我们尝试在名为hoge的数据库中的test集合中创建一个文档。文档本身以json格式输入。MongoDB的特点是可以轻松创建json格式的文档,而不必考虑数据类型等。
use hoge
db.test.insert(
{
name: "mogamoga",
age: 80,
groups: [
{
title: "group1",
description: "hogehoge",
},
{
title: "group2",
},
],
}
)
阅读
下面是获取文档的步骤。如果只是简单的获取,可以使用find来轻松实现。>https://docs.mongodb.com/v3.4/reference/method/db.collection.find/
db.test.find({})
你可以用这个方法获取全部数据。类似于SELECT * FROM test;当然返回的是json格式。下面是刚才命令的输出结果:
{
“_id” : ObjectId(“5a27da255b22277a949b2cab”),
“name” : “mogamoga”,
“age” : 80,
“groups” : [
{
“title” : “group1”,
“description” : “hogehoge”
},
{
“title” : “group2”
}
]
}
可以在find中为第一个参数指定条件,为第二个参数指定欲获取的字段。这也可以在json中指定。就像这样,SELECT _id,name,age FROM test WHERE age=80的感觉。
db.test.find({age: 80}, {_id:1,name:1,age:1})
顺便提一句,在{age:80}中,也可以使用其他运算符。例如{age: {\$gt:80}}或{age: {\$lte:80}}都可以使用。>https://docs.mongodb.com/manual/reference/operator/query-comparison/
更新
下面是更新文档的步骤。由于更新操作中有很多细节,所以这里只记录简单的更新方式。> https://docs.mongodb.com/v3.4/reference/method/db.collection.update/
db.test.update(
{name: "mogamoga"},
{name: "mogamoga", age: 10},
{upsert: true}
)
使用findAndModify或findOneAndUpdate来更新指定的字段,并保留其他字段不变!有关详细说明,请参阅https://docs.mongodb.com/v3.4/reference/method/db.collection.findAndModify/。这样做将完全更新文档。_id字段不会改变,但其他字段将被删除并插入。在创建时,有groups字段,但在上述更新过程中被删除了。
删除
以下是删除文档的步骤。有单个删除的”deleteOne”和多个删除的”deleteMany”两个选项。我们以单个删除为例。请点击此处查看具体例子:>https://docs.mongodb.com/v3.4/reference/method/db.collection.deleteOne/
db.test.deleteOne({_id: ObjectId("5a27da255b22277a949b2cab")})
即使没有匹配的ID,也不会报错。结果的deletedCount将为0。如果删除成功,将返回删除的记录数。
如果条件是字符串等,则可以使用{name:”mogamoga”}之类的条件,但是本次是根据ID进行搜索,因此需要使用ObjectId进行搜索。如果使用{_id:”5a27da255b22277a949b2cab”}进行搜索,则不会删除任何内容,因此需要注意匹配无结果的情况。
最后一句话
尽管下半部分有些随意,我已经写了关于MongoDB的内容。截至2017年12月,它的版本是3.4,但在将来的升级中应该会更好。Mongo的优势之一是聚合(Aggregate),但我打算改变文章的写作方式。感谢您一直阅读到最后。