五分钟让你掌握MongoDB超常用命令
小伙伴们大家好,2023年伊始又和大家见面了,这次我们一起来学习一下MongoDB常用的命令
作为一名合格的前端儿,怎么能不了解Node呢,都说这已经是前端的必备技能,没有之一啦,那么随机附赠的MongoDB数据库想必大家也不能太陌生吧
Anyway,我们学习的目的不能是盲目的,现在前端环境也相较之前好太多,也稳定了很多。所以此次我将与大家一起学学超常用的MongoDB可食用命令套餐
那么,在开始前我有一个小小的要求,那就是由于本人开始搞起了公众号@前端马拉松,还希望喜欢的小伙伴关注一下,让我们无论在哪里都可持续学习、持续进步着
安装MongoDB并启动服务
万事开头难,安装第一步,最简单的方式就是去MongoDB官网下载不同平台的版本即可
Mac
安装
启动MongoDB服务
启服务四部曲
- 进入bin目录:
cd /usr/local/mongodb/bin
- 设置环境变量:
export PATH=/usr/local/mongodb/bin:$PATH
- 执行命令后台启动:
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 在后台运行
5. 输入mongo操作数据库:
mongo
Windows
安装
下载5.x版本,别问,问就是6.x版本有问题
选择自定义安装
创建数据和日志目录
无需安装图形工具
启动MongoDB服务
现在的版本启动后不容易查找到启动成功的默认端口27017,不像之前的版本会在日志的最后一行展示出来
想看看自己到底启动成功没有,我们就打开浏览器直接访问http://localhost:27017 ,出现如下图的样子就是OK了,放心使用
进入后台操作数据库
通过以上几张图片的步骤,一顿操作就算是启动完成了,终于可以开始今天的主题了,接下来可以计时了
一. 数据库操作
查询数据库
只要在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
总结
面对疫情的开放,很多事情会出现不可控,面对不可控的事情要保持乐观
好好的活着,人生这场马拉松本就十分艰难,不以金钱多寡来衡量自己
让自己变的越来越好,升级自己的大脑,升级自己的身体
以后还会一如既往的和大家分享文章进行交流,无论当下环境如何都不能产生抵触和消极的情绪
当下包括我在内,若是吃不了学习的苦,就只能忍受生活的痛!大家一起共勉,持续学习就没有失败者
转载自:https://juejin.cn/post/7186468694158442554