入门MongoDB,看这一篇文章就够了

306 阅读6分钟

本文记录从零上手MongoDB数据库的所需内容,文中不仅介绍了相关知识,而且还配套了相应的 「案例练习」 ,串起了:新建数据库、新建集合和集合中增删改查操作的所有步骤,适合没有使用过MongoDB的朋友

注意:文中安装方式为MacOS,具体的安装、启动数据库方式请使用具体安装方式对应的操作

介绍

MongoDB是一个文档数据库,为简化应用程序的开发与扩展而设计,具有以下特点:

  • 流行的开源文档型数据库,它使用类似 JSON 的文档模型存储数据,这使得数据存储变得非常灵活
  • 基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发
  • 为 WEB 应用提供可扩展的高性能数据存储解决方案
  • 介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的

术语概念

相较于MySQL、Oracle等SQL数据库阵营,术语存在以下区别:

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

安装

建议安装社区版,总共有4种安装方式,选取一种合适的方式进行安装即可(文章使用的版本为7.0):

image.png

启动

安装完成之后,在使用之前需要先启动数据库(ps:以下为MacOS方式,请匹配自己安装方式的启动操作)

brew services start mongodb-community@7.0 // 启动数据库
brew services stop mongodb-community@7.0  // 停止数据库

操作结果示例:

image.png

命令行连接

在启动数据库之后,可以在终端中键入以下指令,进行数据库连接:

mongosh

操作结果示例:

image.png 这样就可以进行数据库操作了。

常用指令

以下指令的讲解中, 带有 「案例练习」 标识,表示可以动手跟着走

温馨提示:

// 遇到不是很清楚的命令,可以在未打完单词的时候使用tab键,即可获得提示
比如键入db.表.create这里就可以点击tab键,就能出来提示了

数据库相关

当数据库连接成功的时候,会默认切换到test数据库,也就是以下展示的样子:

image.png

  • show dbs

    查看所有数据库:

    image.png 其中adminconfiglocaltest是默认创建的数据库。

  • use 数据库名

    使用use databaseName形式,切换到对应数据库,如果没有此数据库,则会新建数据库;比如use local切换到local数据库:

image.png

  • db

    显示当前数据库:

image.png

  • show collections

    显示当前数据库下的集合情况:

image.png

  • db.dropDatabase()

    删除当前正在使用的数据库及其所有集合,这个就不演示了,慎用。


「案例练习」这里使用use case指令,新建一个case数据库,作为此例子的数据库。

    use case

image.png

集合相关

  • db.createCollection(collectionName)

    在当前数据库创建一个集合名为collectionName的集合;

    「案例练习」创建一个user集合:

    db.createCollection('user')
    

    image.png

插入数据

  • db.collectionName.insertOne({...})

    「案例练习」创建一条包含姓名、年龄、状态的用户数据:

    db.user.insertOne({name: 'c', age: 20, status: true})
    

    image.png

  • 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}])
    

    image.png

简单查询数据

经过上方插入数据之后,现在来查询一下目前已有的数据;

  • db.collectionName.find()

    「案例练习」查询collection中的数据

    db.user.find()
    

    image.png

更新数据

这里介绍三种更新数据的方式,他们的模式都是一个规律:第一个参数用于找到需要处理的数据,第二个参数表示如何更改,第三个为可选参数,表示一些其余规则。

  • 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 });
    

    image.png

  • db.collectionName.updateMany(filter, update, options)

    「案例练习」将集合中,age大于100的数据的status字段改为true

    // $gt:大于,$lt:小于;稍后会详细解释这个操作符的意义
    db.user.updateMany({age: {$gt: 100}}, {$set: {status: true}})
    

    image.png

  • 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})
    

    image.png

删除数据

删除数据的模式也和更新一样,第一个参数用于找到需要删除的数据,第二个是可选配置项:

  • 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'})
    

    image.png

  • db.collectionName.deleteMany(filter, options)

    「案例练习」删除集合中age大于20的数据

    db.user.deleteMany({age: {$gt: 20}})
    

    image.png

复杂查询数据

ok,以上就是基础的增删改查了,接下来就是稍微复杂一些的查询,有以下几个部分:

  • 比较操作
  • 逻辑操作
  • 正则表达式
  • 控制返回字段
  • 排序
  • 分页
  • 查询总数

在进入这个环节之前,需要把上面已经删除完的数据,再次使用上方的两条插入操作,添加上数据


添加完数据之后,那么开始吧!

  • 比较操作

    常见的操作符:

    • $gt:大于
    • $gte:大于等于
    • $lt:小于
    • $lte:小于等于

    这里不用死记,g代表greaterl代表lesst代表thane代表equal,所以$gte就是greater than equal,也就是大于等于;其余的也就能推测出来了。

    「案例练习」查询集合中age大于等于80的数据

    db.user.find({age: {$gte: 80}});
    

    image.png

  • 逻辑操作

    常见的操作符:

    • $and:逻辑与,用于组合多个条件,所有条件都必须满足
    • $or:逻辑或,用于组合多个条件,任一条件满足即可
    • $not:逻辑非,用于对条件取反
    • $nor:逻辑与非,要求所有条件都不满足

    「案例练习」查询集合中age大于等于80且status为false的数据

    db.user.find({$and: [{age: {$gt: 80}}, {status: false}]})
    

    image.png

  • 正则表达式

    「案例练习」查询集合中name包含'k'的数据

    db.user.find({name: /k/})
    

    image.png

  • 控制返回字段

    在第二个参数中,需要显示的字段,值设置1;不显示的字段,值设置0;除开_id这个代表主键的属性,参数中没有被提及到的字段则也不会显示(比如下例的status字段,不会显示)。

    「案例练习」查询结果只返回name、age

    db.user.find({}, {name: 1, age: 1, _id: 0})
    

    image.png

  • 排序

    在find后面衔接sort函数,sort函数的参数为需要排序的字段,1表示升序,-1表示降序。

    「案例练习」查询结果按age降序显示

    db.user.find({}, {name: 1, age: 1, _id: 0}).sort({age: -1})
    

    image.png

  • 分页

    使用skip函数和limit函数实现。skip函数表示跳过多少条数据,参数可以传数学表达式;limit函数表示限制几条。

    「案例练习」假设一页数据为2条,现在需要取得第二页的数据

    // 跳过第一页的两条数据后的两条数据
    db.user.find({}, {name: 1, age: 1, _id: 0}).skip(1*2).limit(2)
    

    image.png

  • 查询总数

    使用countDocuments函数,进行处理,参数为查询条件

    「案例练习」获取age大于等于80的总数

    db.user.countDocuments({age: {$gte: 80}})
    

    image.png

    提示:某些旧版本中使用的是db.collectionName.find(...).count()的方式来进行数量查询

使用数据库管理工具

如果你跟着上面的 「案例练习」 走了一遍,相信对于命令行操作,你不会陌生了;用多了你会发现,这样操作好麻烦,一点都不直观。

是的没错,该使用图形化管理工具了,这里我懒得去找破解版的工具,用的是免费的navicat-premium-lite,对于我这种轻度使用的用户足够了。

注意:在使用工具之前记得启动数据库

image.png 此次案例的数据库情况,如上图所示

总结

以上就是入门MongoDB需要了解的基础知识了,当然还有许多不属于入门范畴的知识:索引聚合复制分片等等,文中没有介绍;如果有需要可以点击这里自行了解

好了,到这里就要说再见了,这篇文章字数不少,且其中还有实际操作;估计跟到这里的你,也些许疲惫了,为你点个赞;

假如你正好要了解和上手MongoDB,相信这篇文章会对你有帮助的。

最后,下篇文章再见吧,👋!