本文记录从零上手MongoDB数据库的所需内容,文中不仅介绍了相关知识,而且还配套了相应的 「案例练习」 ,串起了:新建数据库、新建集合和集合中增删改查操作的所有步骤,适合没有使用过MongoDB的朋友
注意:文中安装方式为MacOS,具体的安装、启动数据库方式请使用具体安装方式对应的操作
介绍
MongoDB
是一个文档数据库,为简化应用程序的开发与扩展而设计,具有以下特点:
- 流行的开源文档型数据库,它使用类似 JSON 的文档模型存储数据,这使得数据存储变得非常灵活
- 基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发
- 为 WEB 应用提供可扩展的高性能数据存储解决方案
- 介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
术语概念
相较于MySQL、Oracle等SQL数据库阵营,术语存在以下区别:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
primary key | primary key | 主键,MongoDB自动将_id 字段设置为主键 |
安装
建议安装社区版,总共有4种安装方式,选取一种合适的方式进行安装即可(文章使用的版本为7.0):
启动
安装完成之后,在使用之前需要先启动数据库(ps:以下为MacOS方式,请匹配自己安装方式的启动操作)
brew services start mongodb-community@7.0 // 启动数据库
brew services stop mongodb-community@7.0 // 停止数据库
操作结果示例:
命令行连接
在启动数据库之后,可以在终端中键入以下指令,进行数据库连接:
mongosh
操作结果示例:
这样就可以进行数据库操作了。
常用指令
以下指令的讲解中, 带有 「案例练习」 标识,表示可以动手跟着走
温馨提示:
// 遇到不是很清楚的命令,可以在未打完单词的时候使用tab键,即可获得提示
比如键入db.表.create这里就可以点击tab键,就能出来提示了
数据库相关
当数据库连接成功的时候,会默认切换到test数据库,也就是以下展示的样子:
-
show dbs
查看所有数据库:
其中
admin
、config
、local
、test
是默认创建的数据库。 -
use 数据库名
使用
use databaseName
形式,切换到对应数据库,如果没有此数据库,则会新建数据库;比如use local
切换到local数据库:
-
db
显示当前数据库:
-
show collections
显示当前数据库下的集合情况:
-
db.dropDatabase()
删除当前正在使用的数据库及其所有集合,这个就不演示了,慎用。
「案例练习」这里使用use case
指令,新建一个case
数据库,作为此例子的数据库。
use case
集合相关
-
db.createCollection(collectionName)
在当前数据库创建一个集合名为collectionName的集合;
「案例练习」创建一个user集合:
db.createCollection('user')
插入数据
-
db.collectionName.insertOne({...})
「案例练习」创建一条包含姓名、年龄、状态的用户数据:
db.user.insertOne({name: 'c', age: 20, status: true})
-
db.collectionName.insertMany([{...}, {...}, ..., {...}])
「案例练习」创建多条包含姓名、年龄、状态的用户数据:
db.user.insertMany([{name: 'cx', age: 40, status: false}, {name: 'cxk', age: 80, status: true}, {name: 'cxkc', age: 160, status: true}, {name: 'cxkcx', age: 320, status: false}])
简单查询数据
经过上方插入数据之后,现在来查询一下目前已有的数据;
-
db.collectionName.find()
「案例练习」查询collection中的数据
db.user.find()
更新数据
这里介绍三种更新数据的方式,他们的模式都是一个规律:第一个参数用于找到需要处理的数据,第二个参数表示如何更改,第三个为可选参数,表示一些其余规则。
- db.collectionName.updateOne(filter, update, options)
- db.collectionName.updateMany(filter, update, options)
- db.collectionName.replaceOne(filter, replacement, options)
其中参数:
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- replacement:新的文档,将替换旧的文档。
- options:可选参数对象
- upsert:如果没有匹配的文档,是否插入一个新文档。
- arrayFilters:当更新嵌套数组时,指定应更新的数组元素的条件。
- collation:指定比较字符串时使用的排序规则。
接下来,依次使用一下这三个方法:
-
db.collectionName.updateOne(filter, update, options)
「案例练习」将集合中,name为”c“的数据的年龄改为30
// 注意:update中的形式为$set:{...},代表将对应的字段值更新为传入的字段值,不影响整体; // 若是直接传入{age: 30},则该条数据会被覆盖为{age: 30},name、status字段丢失 db.user.updateOne({ name: "c" },{ $set: { age: 30 } },{ upsert: false });
-
db.collectionName.updateMany(filter, update, options)
「案例练习」将集合中,age大于100的数据的status字段改为true
// $gt:大于,$lt:小于;稍后会详细解释这个操作符的意义 db.user.updateMany({age: {$gt: 100}}, {$set: {status: true}})
-
db.collectionName.replaceOne(filter, replacement, options)
「案例练习」将集合中,name为”c“的数据的年龄改为这条数据{name: 'c', age: 20, status: false}
db.user.replaceOne({name: 'c'}, {name: 'c', age: 20, status: false})
删除数据
删除数据的模式也和更新一样,第一个参数用于找到需要删除的数据,第二个是可选配置项:
- db.collectionName.deleteOne(filter, options)
- db.collectionName.deleteMany(filter, options)
其中参数:
- filter:用于查找要删除的文档的查询条件
- options(可选):一个可选参数对象
- writeConcern:指定写操作的确认级别。
- collation:指定比较字符串时使用的排序规则。
接下来,依次使用这两个方法:
-
db.collectionName.deleteOne(filter, options)
「案例练习」删除集合中name为'c'的数据
db.user.deleteOne({name: 'c'})
-
db.collectionName.deleteMany(filter, options)
「案例练习」删除集合中age大于20的数据
db.user.deleteMany({age: {$gt: 20}})
复杂查询数据
ok,以上就是基础的增删改查了,接下来就是稍微复杂一些的查询,有以下几个部分:
- 比较操作
- 逻辑操作
- 正则表达式
- 控制返回字段
- 排序
- 分页
- 查询总数
在进入这个环节之前,需要把上面已经删除完的数据,再次使用上方的两条插入操作,添加上数据
添加完数据之后,那么开始吧!
-
比较操作
常见的操作符:
$gt
:大于$gte
:大于等于$lt
:小于$lte
:小于等于
这里不用死记,
g
代表greater
,l
代表less
,t
代表than
,e
代表equal
,所以$gte
就是greater than equal
,也就是大于等于;其余的也就能推测出来了。「案例练习」查询集合中age大于等于80的数据
db.user.find({age: {$gte: 80}});
-
逻辑操作
常见的操作符:
$and
:逻辑与,用于组合多个条件,所有条件都必须满足$or
:逻辑或,用于组合多个条件,任一条件满足即可$not
:逻辑非,用于对条件取反$nor
:逻辑与非,要求所有条件都不满足
「案例练习」查询集合中age大于等于80且status为false的数据
db.user.find({$and: [{age: {$gt: 80}}, {status: false}]})
-
正则表达式
「案例练习」查询集合中name包含'k'的数据
db.user.find({name: /k/})
-
控制返回字段
在第二个参数中,需要显示的字段,值设置1;不显示的字段,值设置0;除开_id这个代表主键的属性,参数中没有被提及到的字段则也不会显示(比如下例的status字段,不会显示)。
「案例练习」查询结果只返回name、age
db.user.find({}, {name: 1, age: 1, _id: 0})
-
排序
在find后面衔接sort函数,sort函数的参数为需要排序的字段,1表示升序,-1表示降序。
「案例练习」查询结果按age降序显示
db.user.find({}, {name: 1, age: 1, _id: 0}).sort({age: -1})
-
分页
使用skip函数和limit函数实现。skip函数表示跳过多少条数据,参数可以传数学表达式;limit函数表示限制几条。
「案例练习」假设一页数据为2条,现在需要取得第二页的数据
// 跳过第一页的两条数据后的两条数据 db.user.find({}, {name: 1, age: 1, _id: 0}).skip(1*2).limit(2)
-
查询总数
使用countDocuments函数,进行处理,参数为查询条件
「案例练习」获取age大于等于80的总数
db.user.countDocuments({age: {$gte: 80}})
提示:某些旧版本中使用的是
db.collectionName.find(...).count()
的方式来进行数量查询
使用数据库管理工具
如果你跟着上面的 「案例练习」 走了一遍,相信对于命令行操作,你不会陌生了;用多了你会发现,这样操作好麻烦,一点都不直观。
是的没错,该使用图形化管理工具了,这里我懒得去找破解版的工具,用的是免费的navicat-premium-lite,对于我这种轻度使用的用户足够了。
注意:在使用工具之前记得启动数据库
此次案例的数据库情况,如上图所示
总结
以上就是入门MongoDB需要了解的基础知识了,当然还有许多不属于入门范畴的知识:索引
、聚合
、复制
、分片
等等,文中没有介绍;如果有需要可以点击这里自行了解。
好了,到这里就要说再见了,这篇文章字数不少,且其中还有实际操作;估计跟到这里的你,也些许疲惫了,为你点个赞;
假如你正好要了解和上手MongoDB,相信这篇文章会对你有帮助的。
最后,下篇文章再见吧,👋!