本文介绍NoSQL技术:MongoDB的安装。操作系统:Ubuntu24.04
MongoDB介绍
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
MongoDB安装
Apt单节点安装
我们就用最简单的单节点模式安装
在mongodb官网上有完整的apt安装方法(英文版),认真读一下,对着操作就可以了。
https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/
先查看我的ubuntu版本
cat /etc/lsb-release
发现是24.04,noble版本
(1)导入MongoDB公钥(Import the public key used by the package management system)
MongoDB是一个签名的包,因此我们需要添加其公钥以确保在安装过程中的数据完整性。
先安装gnupg和curl,执行下列代码:
gnupg:GNU Privacy Guard(GnuPG或GPG)是一种加密软件,它是PGP加密软件的满足GPL的替代物。
curl:cURL 是一个网络数据传输项目。
sudo apt-get install gnupg curl
导入MongoDB公共GPG秘钥,执行下列代码:
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
(2)为mongodb创建文件列表(Create a list file for MongoDB)
注册mongodb源,添加MongoDB存储库,为mongodb创建文件列表,执行下列命令,注意这个命令是在一行。这句代码比较长,请敲完后仔细检查一下再回车执行。
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
(3)更新本地安装包文件(Reload local package database)
执行下列代码:
sudo apt-get update
(4)安装mongodb包(Install the MongoDB packages)
在安装时,可以安装mongdb最新版本,或者某一个指定版本。这里我安装最新版,执行下列代码;
sudo apt-get install -y mongodb-org
mongdb完成安装后,在shell中输入以下命令查看MongoDB版本:
mongod -version
显示安装的mongodb版本是8.0.6,和前面我们在网站上查询的最新版版本号一致
启动和关闭MongoDB
(1)启动mongod进程,执行下面命令:
sudo systemctl start mongod
(2)验证mongodb是否启动成功,执行下面命令:
sudo systemctl status mongod
状态显示是active:
(3)为了确保MongoDB在系统启动时自动启动,我们需要使其自启。使用以下命令设置MongoDB为自启动:
sudo systemctl enable mongod
(4)停止mongodb,执行下面命令:
sudo systemctl stop mongod
(5)重启mongodb,执行下面命令:
sudo systemctl restart mongod
使用MongoDB(shell模式)
我们借助mongosh命令来完成mongodb的相关管理工作。
参考:
https://www.cnblogs.com/wyy1234/p/10919567.html
https://blog.csdn.net/janyxe/article/details/125422873
https://blog.csdn.net/weixin_57367513/article/details/132582056
(1)进入mongosh
输入下列命令:
mongosh
输入命令
show dbs
这里,我们可以看到,系统安装成功以后,会自带三个库,分别是admin、config、local。
MongoDB和SQL中的概念对应关系:
(2)创建数据库
在mongosh中,我们使用命令use可以完成数据库的创建与切换(如果该数据库不存在会自动创建,已经存在的数据库则切换过去)。下面,我们创建一个名称为school的库。
use school
show collections命令可以查看数据库中的集合(即表),执行下列命令:
show collections
发现数据库school中默认没有任何表。
另外,如果使用 show dbs查看数据库,会发现没有显示school数据库。这是因为如果真的想把这个数据库创建成功,那么必须插入一个数据。
(3)创建集合
在MongoDB中,集合是自动创建的。当你向一个不存在的集合中插入文档时,MongoDB会自动创建这个集合。你也可以使用MongoDB提供的db.createCollection()方法来显式创建集合。例如,要创建名为teacher的集合,可以使用以下命令:
db.createCollection("teacher")
说明:
即使不建立这个集合,直接向集合中插入数据,这个集合也能被创建出来。
(4)新增数据
向MongoDB集合中新增记录非常简单,只需要使用集合对象的insertOne()或insertMany()方法即可。例如,要向名为teacher的集合中增加一条文档记录,可以使用以下命令:
db.teacher.insertOne({"name":"zhangsan","gender":"male"})
说明:
- MongoDB是文档数据库,设计理念是将数据存储为一个文档,而不是存储在表中的行。MongoDB 中的文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都BSON 格式。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
- db.teacher.insertOne({"name":"zhangsan","gender":"male"}) 这句代码有的教程中会写为db.teacher.insertOne({name:"zhangsan",gender:
"male"}),这样执行也不会出错。不过按照规范,JSON 键值对的 Key 要加引号,建议严格遵循JSON规范给key加引号。
- MongoDB没有固定的模式,即同一集合中的文档结构模式与数据类型可以不同。例如下面新增teacher有name和age属性,前面范例新增的teacher有name和gender属性,两个不一样没有问题(当然很多时候也都用一样的属性)。
- _id 键类似于SQL中的主键,可以由开发者指定,也可以由MongoDB自动生成。如果插入文档时没有 _id 键,系统会自动创建。MongoDB中存储的文档必须有这个“_id”键。这个键的值可以是任意类型,默认是个ObjectId对象,每个文档有唯一的 _id ,确保集合中的每个文档都会被唯一标示。
如果要新增多个文档,可以使用insertMany()方法,例如:
db.student.insertMany([{"_id":1,"name":"Alice","age":20},{"_id":2,"name":"Bob","age":21},{"_id":3,"name":"Claus","age":19}])
说明:
- 该范例以前并没有建立集合student,在新增文档数据时,MongdoDB发现没有集合student,就自动创建了该集合。
- 这个范例中,手工指定了 _id 属性的值,必须保证 _id 的唯一性。
insert() 可插入单个或者多个数据(文档),等同于insertOne()+insertMany())与save()两个命令
mongoDB中插入数据有insert()与save()两个命令,二者的联系是:
- 对于数据库中没有改字段,两者没有区别;
- 对于数据库中有该字段,insert会报错,save会执行更新操作
- 若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改原来的内容为新内容。
例如,如果我们执行下列代码:
db.student.insert({"_id":3,"name":"Claus","age":20})
从上面看到发生了错误,因为这些字段已经有了,所以无法insert。
现在我们再来试试save()命令,执行代码:
db.student.save({"_id":3,"name":"Claus","age":20})
结果也出现了错误:
提示save is not a function,在网上查了一下,据说因为MongoDB的版本原因,有些命令已经不支持了,比如原来的db.集合名.save()就已经不能用了。
https://blog.csdn.net/mez_Blog/article/details/131049563
(5)查询数据
db.集合名.find()来查看我们对应集合的内容,执行下面的代码:
db.student.find()
可以查看到student表中的所有数据
查询时可以传入查询条件,例如,查询name=Bob的记录,执行下列代码:
db.student.find({"name":"Bob"})
查询还有很多范例,如AND条件查询、OR条件查询等
(6)更新数据
update() 方法用于更新已存在的文档。语法格式如下:
db.collectionName.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query:update的查询条件,类似sql update查询内where后面的。
update:update的对象和一些更新的操作符(如$,$inc..)等,也可以理解为sql update查询内set后面的
upsert:可选,这个参数的意思是,如果不存在update的记录,是否当新数据插入,true为插入,默认是false,不插入。
multi:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern:可选,抛出异常的级别。
例如,执行代码更新一条数据:
db.student.update({"name":"Bob"},{$set:{"age":24}})
结果给出了以下提醒,说update()方法已经过时了,提醒我们可以使用updateOne、updateMany、bulkWrite这几个方法
我们把代码修改为:
db.student.updateOne({"name":"Bob"},{$set:{"age":24}})
看到已经更新成功
(7)删除记录
remove()函数是用来移除集合中的数据,语法格式如下:
db.collectionName.remove(
{
<query>,
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
query:(可选)删除的文档的条件。
justOne:(可选)如果设为 true 或 1,则只删除一个文档。
writeConcern:(可选)抛出异常的级别。
例如,执行代码删除一条数据:
db.student.remove({"name":"Bob"})
同样,结果给出了以下提醒,说remove()方法已经过时了,提醒我们可以使用deleteOne、deleteMany、bulkWrite这几个方法
我们把代码修改为:
db.student.deleteOne({"name":"Bob"})
删除记录成功
(8)删除集合
集合删除语法格式是db.collection.drop(),例如我们删除student集合,执行下列代码:
db.student.drop()
删除后,查看该表内容,没有记录了
(9)删除数据库
集合删除语法格式是db.dropDatabase(),例如我们删除school数据库,执行下列代码:
db.dropDatabase()
删除后,查看该数据库,没有集合了
(10)退出Mongodb Shell模式
可以输入如下命令退出MongoDB Shell模式:
exit