五分钟让你掌握MongoDB超常用命令

1,939 阅读6分钟

小伙伴们大家好,2023年伊始又和大家见面了,这次我们一起来学习一下MongoDB常用的命令

作为一名合格的前端儿,怎么能不了解Node呢,都说这已经是前端的必备技能,没有之一啦,那么随机附赠的MongoDB数据库想必大家也不能太陌生吧

Anyway,我们学习的目的不能是盲目的,现在前端环境也相较之前好太多,也稳定了很多。所以此次我将与大家一起学学超常用的MongoDB可食用命令套餐

那么,在开始前我有一个小小的要求,那就是由于本人开始搞起了公众号@前端马拉松,还希望喜欢的小伙伴关注一下,让我们无论在哪里都可持续学习、持续进步着

安装MongoDB并启动服务

万事开头难,安装第一步,最简单的方式就是去MongoDB官网下载不同平台的版本即可

Mac

安装

mongodb-mac.jpg

启动MongoDB服务

启服务四部曲

  1. 进入bin目录:cd  /usr/local/mongodb/bin
  2. 设置环境变量:export PATH=/usr/local/mongodb/bin:$PATH
  3. 执行命令后台启动:mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
    • --dbpath 设置数据存放目录,/usr/local/var/mongodb是我已创建好的目录
    • --logpath 设置日志存放目录,/usr/local/var/log/mongodb/mongo.log同理
    • --fork 在后台运行

fork_mongo.jpg 5. 输入mongo操作数据库:mongo

mongo_ok.jpg

Windows

安装

下载5.x版本,别问,问就是6.x版本有问题 image.png

选择自定义安装

image.png

创建数据和日志目录

image.png

无需安装图形工具

image.png

启动MongoDB服务

现在的版本启动后不容易查找到启动成功的默认端口27017,不像之前的版本会在日志的最后一行展示出来

image.png 想看看自己到底启动成功没有,我们就打开浏览器直接访问http://localhost:27017 ,出现如下图的样子就是OK了,放心使用 image.png

进入后台操作数据库

image.png

通过以上几张图片的步骤,一顿操作就算是启动完成了,终于可以开始今天的主题了,接下来可以计时了

一. 数据库操作

查询数据库

只要在MongoDB后台中输入show dbs,就会展示出你所有的数据库

show dbs    // 查询所有数据库
admin 0.000GB    // 默认
config 0.000GB   // 默认
local 0.000GB    // 默认
mall 0.000GB     // 我创建的

使用数据库

use 数据库名表示使用某个数据库,如下方代码表示使用mall这个数据库

use mall
switched to db mall   // 使用成功会显示这一行内容

还有一个点要说明,那就是除了使用数据库外,在通过输入该命令的时候,如果数据库不存在,会直接进行创建操作

删除当前使用数据库

假使我现在新创建一个一个数据库,执行use mdb,创建一个名为mdb的数据库,然后再删除这个数据库,执行db.dropDatabase()即可

use mdb
switched to db mdb

db.dropDatabase()
{ "ok" : 1 }    // 删除当前使用的数据库成功

查看当前db的链接机器地址

我们很单纯的就是想看看现在链接的数据库地址是多少,于是只需要执行db.getMongo()就可以看到

db.getMongo()
connection to 127.0.0.1:27017   // 链接的数据库地址

二. 集合操作

显示所有集合

显示所有集合的命令是show collections,简单明了,这里顺便插播一句,数据库 包含 集合集合 包含 数据

好了,继续搞起来,我们先使用mall这个数据库use mall,然后查看里面的所有集合

show collections
sessions    // 集合sessions
users    // 集合users

创建一个集合

执行db.createCollection('集合名', 对象参数)的命令,就可以创建一个集合了

db.createCollection('goods', {size: 30, max: 100})
{ "ok" : 1 }    // 成功创建集合

show collections
goods    // 展示了最新创建的集合
sessions
users

重命名集合

执行db.集合名.renameCollection('新名')命令,可以对已有集合进行重命名操作

db.goods.renameCollection('products')
{ "ok" : 1 }    // 重命名成功

show collections
products    // 新的集合名
sessions
users

删除集合

执行db.集合名.drop()命令,直接对集合进行删除操作

db.products.drop()
true    // 显示true表示删除集合成功

db.goods.drop()
false    // 由于没有goods集合,所以false删除失败

三. 增加、删除、修改操作

可以说,前面的种种不过是开胃小菜,真正的主菜现在才上来,对于数据库操作来说,我们最最最多的操作就是增删改查了,其中查询又是特别的关键(最后讲)

添加数据(文档)

添加数据的操作需要执行db.集合名.save(对象参数)命令,下面就简单添加一条数据,字段包含username、email、password、avatar、age

// 添加一条
db.users.save({username:'xiaobai',email:'xiaobaiiscat@sohu.com',password:'fe546279a62sjw12l8ca334b675ksyt0',avatart:'https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg'})
WriteResult({ "nInserted" : 1 })   // 添加成功会显示你成功的条数为1

// 添加多条,传入数组即可
db.users.save([{数据1}, {数据2}])
BulkWriteResult({    // 添加成功会在nInserted字段看到数量
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

其实,执行db.集合名.insert(对象参数)也可以添加数据,不过二者的区别主要是在save方法中,如果_id主键存在的情况会更新数据,不存在就插入数据,所以不难看出save方法是又可以添加又可以更新的好手

insert在_id主键存在的情况下会有报错,提示主键重复,也就无法添加数据了

删除数据(文档)

remove方法用来删除数据的操作

删除所有数据

执行db.集合名.remove({})就是删除所有的数据了,如删除users集合对应的所有数据(风险太大别试),db.users.remove({})

删除某条数据

现在我们来看看怎么删除指定的某条数据,上面没有展开说remove方法

接下来好好介绍一下,db.集合名.remove(条件参数对象, 删一条还是全部, 抛出异常的级别),这里我着重说一下第二个参数,默认值是false表示全部删除。如果第二个参数为true或1的话,就只删除符合条件的一条数据

// 删除username=xiaobai的数据
db.users.remove({username:'xiaobai'})
WriteResult({ "nRemoved" : 1 })

修改数据(文档)

执行update方法可以对数据进行修改操作,db.集合名.update(查询条件参数对象, 更新条件参数对象, 不存在的条件是否插入, 更新查询的第一条还是全部)

向xiaobai的数据中添加字段age为7

db.users.update({username:'xiaobai'}, {$set:{age:7}})  // $set表示设置操作符
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })  // 更新成功
  • 查询条件参数对象:{username:'xiaobai'}
  • 更新条件参数对象:{$set:{age:7}}
  • 不存在的条件是否插入:默认false不插入
  • 更新查询的第一条还是全部:默认false,只更新找到的第一条

向chdlovejob的数据中age字段再+8

db.users.update({username:'chdlovejob'}, {$inc:{age:8}})  // $inc表示增加操作符
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

好了,以上我们就迅速的把增删改的操作熟悉了,再接再厉把重点放在查询上吧

四. 集合查询操作

上面已经介绍了增删改的操作,现在把精力再次集中起来,我们全力以赴搞定查询操作的最常见命令吧

查询所有数据

通过执行db.集合名.find()指令,直接查询到该集合中的所有数据

在find()之后再加上pretty()可以格式化数据展示更美观些

db.users.find().pretty()
{
  "_id" : ObjectId("621394ae07733e48f1aceffc"),
  "username" : "chenzuoxi",
  "email" : "1027272807@qq.com",
  "password" : "fe546279a62683de8ca334b673420696",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 30
  "__v" : 0
}
{
  "_id" : ObjectId("6213a0e165069d384c7bcd62"),
  "username" : "chdlovejob",
  "email" : "mrchen1107@163.com",
  "password" : "0bc24ba557a2526a83e81c8672be2f88",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 32,
  "__v" : 0
}

默认每页显示20条,用DBQuery.shellBatchSize= 50;可设置每页显示50条数据

去重查询所有数据

执行db.集合名.distinct('字段名'),可以帮助我们去重对应字段的数据

下面代码,我新增了几条数据,其中有两条为username=xiaobai,这样就有了重复的数据,接下来进行去重查询,会得到一个数组类型的数据结果

db.users.distinct('username')
["chenzuoxi","chdlovejob","xiaobai","xiaohei"]

查询第一条数据

db.集合名.findOne()直接可以查找到集合中的第一条数据

db.users.findOne()
{
  "_id" : ObjectId("621394ae07733e48f1aceffc"),
  "username" : "chenzuoxi",
  "email" : "1027272807@qq.com",
  "password" : "fe546279a62683de8ca334b673420696",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 30
  "__v" : 0
}

查询指定条件的数据

上面的都是查询缺少条件的查询,然而我们查询都是需要一些指定条件的,比如想查询username = chdlovejob的数据,那么就需要通过db.集合名.find(条件参数对象)来操作

db.users.find({username: 'chdlovejob'})

{
  "_id" : ObjectId("6213a0e165069d384c7bcd62"),
  "username" : "chdlovejob",
  "email" : "mrchen1107@163.com",
  "password" : "0bc24ba557a2526a83e81c8672be2f88",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 32,
  "__v" : 0
}

查询age > 18 和 age < 18 的数据

根据条件来查询数据,对于大于使用的是$gt关键字,小于则是$lt关键字, 那么如果有等于的情况就是加个e,如大于等于是$gte,小于等于是$lte

// age > 18 的查询条件
db.users.find({age: {$gt: 18}})
{
  "_id" : ObjectId("621394ae07733e48f1aceffc"),
  "username" : "chenzuoxi",
  "email" : "1027272807@qq.com",
  "password" : "fe546279a62683de8ca334b673420696",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 30
  "__v" : 0
}
{
  "_id" : ObjectId("6213a0e165069d384c7bcd62"),
  "username" : "chdlovejob",
  "email" : "mrchen1107@163.com",
  "password" : "0bc24ba557a2526a83e81c8672be2f88",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 32,
  "__v" : 0
}

// age < 18 的查询条件
db.users.find({age: {$lt: 18}})
{
  "_id" : ObjectId("63b2a75cf36b67e39f47655a"),
  "username" : "xiaobai",
  "email" : "xiaobaiiscat@sohu.com",
  "password" : "fe546279a62sjw12l8ca334b675ksyt0",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 7
  "__v" : 0
}
{
  "_id" : ObjectId("63b2a94ff36b67e39f47655b"),
  "username" : "xiaohei",
  "email" : "thanatos@sohu.com",
  "password" : "0bc24ba557a252ehanatos11071c8688",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 10,
  "__v" : 0
}

查询age >= 10 且 < 28的数据

可以写在一个指定条件里多写些查询条件,如下方代码

db.users.find({age: {$gte: 10, $lt: 28}})
{
  "_id" : ObjectId("63b2a94ff36b67e39f47655b"),
  "username" : "xiaohei",
  "email" : "thanatos@sohu.com",
  "password" : "0bc24ba557a252ehanatos11071c8688",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 10,
  "__v" : 0
}

查询匹配的数据

如果想查询email中包含sohu的数据总共有哪些,那么我们可以使用正则来进行匹配,非常的简单

// 查询email中包含sohu字段的条件
db.users.find({email: /sohu/})
{
  "_id" : ObjectId("63b2a75cf36b67e39f47655a"),
  "username" : "xiaobai",
  "email" : "xiaobaiiscat@sohu.com",
  "password" : "fe546279a62sjw12l8ca334b675ksyt0",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 7
  "__v" : 0
}
{
  "_id" : ObjectId("63b2a94ff36b67e39f47655b"),
  "username" : "xiaohei",
  "email" : "thanatos@sohu.com",
  "password" : "0bc24ba557a252ehanatos11071c8688",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 10,
  "__v" : 0
}

// 查询username中以xiao开头的条件
db.users.find({username: /^xiao/})
// 所查数据同上

查询指定列的数据

如果说我们想查询username和age这两列的数据,可以指派find的第二个参数出场了,db.users.find(条件参数对象,返回指定的键)

注意:_id字段是MongoDB自动生成的会在查询数据中带着

// 指定查找只包含username和age键的数据并且不含_id键
// 也可用true代替1,false的话会排除该字段
db.users.find({}, {username:1,age:1,_id:0})
{ "username": "chenzuoxi","age": 30 }
{ "username": "chdlovejob","age": 32 }
{ "username": "xiaobai","age": 7 }
{ "username": "xiaohei","age": 10 }

当然也可以带着条件进行查询,比如查询age < 18的条件并且只展示username和age的结果

db.users.find({age:{$lt: 18}}, {username:1,age:1,_id:0})
{ "username": "xiaobai","age": 7 }
{ "username": "xiaohei","age": 10 }

排序查询的数据

sort(排序条件参数)是进行排序的命令,传入1表示升序,表如-1表示降序

下面演示根据age排序的代码

db.users.find({},{username:1,age:1,_id:0}).sort({age: 1})    // 传入1是升序,传入-1是降序
{ "username": "xiaobai","age": 7 }
{ "username": "xiaohei","age": 10 }
{ "username": "chenzuoxi","age": 30 }
{ "username": "chdlovejob","age": 32 }

查询前3条的数据

如果你想获取到查询到的前3条数据,那么就该我们的limit(整数)出场了

db.users.find({}, {username:1,age:1,_id:0}).limit(3)
{ "username": "chenzuoxi","age": 30 }
{ "username": "chdlovejob","age": 32 }
{ "username": "xiaobai","age": 7 }

查询3条以后的数据

skip(整数)方法专门用来跳过指定数量的数据,下面展示的就是查询3条以后的数据了

db.users.find().skip(3)
{ "username": "xiaohei","age": 10 }

查询2-4条的数据

由于目前数据太少,在进行范围查询的时候就只靠这4条数据来查了,下面我们来查询2-4条的数据

// 查询2-4条数据,那么一共3条。用limit指定3条,再用skip跳过第1条
db.users.find({},{username:1,age:1,_id:0}).limit(3).skip(1)
{ "username": "chdlovejob","age": 32 }
{ "username": "xiaobai","age": 7 }
{ "username": "xiaohei","age": 10 }

一般情况可用于分页处理的,limit是pageSize,skip是第几页*pageSize

或条件查询的数据

在find中使用$or关键字可以进行或查询功能,条件写入一个数组形式,内部都是查询的条件对象

// 查询age为7或者age为30的条件
db.users.find({$or: [{age:7}, {age:30}]})

{
  "_id" : ObjectId("63b2a75cf36b67e39f47655a"),
  "username" : "xiaobai",
  "email" : "xiaobaiiscat@sohu.com",
  "password" : "fe546279a62sjw12l8ca334b675ksyt0",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 7
  "__v" : 0
}
{
  "_id" : ObjectId("621394ae07733e48f1aceffc"),
  "username" : "chenzuoxi",
  "email" : "1027272807@qq.com",
  "password" : "fe546279a62683de8ca334b673420696",
  "avatar" : "https://img4.kuwo.cn/star/albumcover/120/40/14/2846092214.jpg",
  "age": 30
  "__v" : 0
}

查询结果集的条数

count()会返回所有数据的总条数,一般也用来记录total数据

db.users.find().count()
4

总结

面对疫情的开放,很多事情会出现不可控,面对不可控的事情要保持乐观

好好的活着,人生这场马拉松本就十分艰难,不以金钱多寡来衡量自己

让自己变的越来越好,升级自己的大脑,升级自己的身体

以后还会一如既往的和大家分享文章进行交流,无论当下环境如何都不能产生抵触和消极的情绪

当下包括我在内,若是吃不了学习的苦,就只能忍受生活的痛!大家一起共勉,持续学习就没有失败者