上一篇文章介绍了MySQL,今天来介绍一下MongoDB,相较于MySQL而言,它是简单的。
简介
MongoDB是一种开源的、跨平台的文档数据库,采用NoSQL数据库的形式。它以高性能、高可用性和灵活的数据模型而闻名,适用于大规模数据存储和处理。MongoDB使用BSON(Binary JSON)格式存储数据,支持复制、故障转移、自动分片等功能,被广泛应用于Web应用程序、大数据分析等领域。
简单说,它是一种非关系型数据库(NoSQL),采用json格式的数据进行存储。
它通常不需要像MySQL那样操作前还需要进行登录,但也可以创建具有不同权限的用户。
安装
安装过程比较简单,这里我直接放一个官方安装教程,需要的同志可以跳转。
官方安装教程https://docs.mongoing.com/install-mongodbmongoDB的可视化工具一般是使用 robo,图标长这样:。自己点一下放大。
操作
老生长谈了,数据库操作无非四个字“增删改查”,英文就是CRUD(create, read, update, delete),如果你能说出来CRUD,那会高级一点。
DB操作
同样的操作,win+r,type into cmd, enter。
然后输入mongo,再来一个回车,好的,就会出现下面的界面:
这里肯定是有人会报错的, 因为是需要配置环境变量的,不配置,不行。
配置环境变量
先找到你的mongo的安装位置, 找到bin文件夹,点进去然后复制路径,我的是:D:\Program Files\MongoDB\Server\4.0\bin,然后按着下面的操作
最后你点击了新建,粘贴你的路径就行了,就可以在终端进行操作了。
db操作
mongDB每行代码可以不加分号。
此句就是展示你现有的数据库,且只显示非空数据库。
show dbs
然后是选择数据库,没有这个数据库就会自动创建,创建后会自动切换到此数据库,是不是比MySQL方便多了:
# 选择名为student的数据库
use student
删除数据库(删除之前先切换到此数据库,所以不用写db的名字):
drop.database()
collection操作
collection就是集合,他就像MySQL中的一个表。
创建名字为info的集合:
db.createCollection('info')
其实你不需要创建集合,使用的时候自动会创建。
删除info集合:
db.info.drop()
数据操作
先介绍一下mongoDB的文件结构,看图:
我点开了一个我创建的4399数据库,Collections就是创建的集合,集合game里面是很多的文档,每个文档就像mysql中的一行,而且每个文档之间是独立的,意思就是它存储的数据不像MySQL那样受列的限制,每个文档内部是这样的:
里面的数据就是json格式,你发现“_id”了吗,这个id是自动创建的,是用于标识的,不用管。
查询
可以采用find()方法,返回与查询条件匹配的所有文档:
// 查找所有文档
db.collection.find();
// 查找特定文档
db.collection.find({ name: "John Doe" });
还有一个findOne(),它只能返回一条查询数据。
插入
要插入一条新文档,可以使用 insertOne()
或 insertMany()
方法。
insertOne()
:插入单个文档。insertMany()
:插入多个文档。
// 插入单个文档
db.collection.insertOne({ name: "John Doe", age: 30 });
// 插入多个文档
db.collection.insertMany([
{ name: "Jane Doe", age: 25 },
{ name: "Peter Parker", age: 20 }
]);
插入一条一个{}就行,插入多个 用[]包括{},一个{}代表一条。
删除
要删除文档,可以使用 deleteOne()
或 deleteMany()
方法。
deleteOne()
:删除与查询条件匹配的第一条文档。deleteMany()
:删除与查询条件匹配的所有文档。
// 删除单个文档
db.collection.deleteOne({ name: "John Doe" });
// 删除多个文档
db.collection.deleteMany({ age: { $gt: 30 } });
$gt的意思就是gteater than(大于),下面还会介绍。
删除多个文档是删除与条件相匹配的文档 。
修改
要更新文档,可以使用 updateOne()
或 updateMany()
方法。
updateOne()
:更新与查询条件匹配的第一条文档。updateMany()
:更新与查询条件匹配的所有文档。
// 更新单个文档
db.collection.updateOne({ name: "John Doe" }, { $set: { age: 31 } });
// 更新多个文档
db.collection.updateMany({ age: { $gt: 25 } }, { $inc: { age: 1 } });
update这个函数需要注意,第一个{}代表条件,第二个{}代表更新值,$set什么意思?如果不加这个,那么文档的所有的原有值将会被替换成更新值,加了就是替换对应的值。
第二句$inc
是 MongoDB 中的更新操作符,用于将数字字段增加指定的值。
查询条件
比较运算符
$eq | equal 等于 |
$ne | not equal 不等于 |
$gt | greater than 大于 |
$lt | less than 小于 |
$gte | greater than equal 大于等于 |
$lte | less than equal 小于等于 |
加上英语是不是变得很简单了,就是取了首字母,还有一点想必你也注意到了,就是使用这些符号需要加上$.
逻辑运算
MongoDB 中的逻辑运算符用于将多个查询条件组合在一起。
逻辑运算符:
$and
: 所有条件都必须为真$or
: 至少一个条件必须为真$not
: 条件必须为假
// 查找年龄大于 30 且名称等于 "John Doe" 的文档
db.collection.find({ $and: [{ age: { $gt: 30 } }, { name: "John Doe" }] });
// 查找年龄大于 30 或名称等于 "Jane Doe" 的文档
db.collection.find({ $or: [{ age: { $gt: 30 } }, { name: "Jane Doe" }] });
// 查找名称不等于 "John Doe" 的文档
db.collection.find({ $not: { name: "John Doe" } });
其实这个$and是不必要的,因为你find()的时候是可以加多个条件的,就等于是and。 但是要放在一个{}里:{"key":value, "key":value}
成员运算
应该就一个,$in
// 查询了stu集合里age等于10或20的文档
db.stu.find({'age':{$in:[10,20]}})
正则
惊喜不惊喜,意外不意外,mongo中竟然可以用正则,反正我今天学的时候是挺意外的,因为正则很强,爬虫中必不可少吧。正则是啥?那你需要动手查查了。
查找包含特定字符序列的文档:
db.collection.find({ name: { $regex: /John/ } });
此查询将查找名称字段中包含字符串 "John" 的所有文档。
查找以特定字符序列开头的文档:
db.collection.find({ name: { $regex: /^John/ } });
此查询将查找名称字段以字符串 "John" 开头的所有文档。
查找以特定字符序列结尾的文档:
db.collection.find({ name: { $regex: /John$/ } });
此查询将查找名称字段以字符串 "John" 结尾的所有文档。
查找包含特定模式的文档:
db.collection.find({ name: { $regex: /J.* Doe/ } });
此查询将查找名称字段与模式 "J.* Doe" 匹配的所有文档,其中 ".*" 表示任意数量的任何字符。
查找不包含特定字符序列的文档:
db.collection.find({ name: { $not: { $regex: /John/ } } });
此查询将查找名称字段中不包含字符串 "John" 的所有文档。
注意:
- 正则表达式必须使用
/
字符界定。 - 正则表达式可以使用各种修饰符,例如
i
(不区分大小写)和m
(多行)。 - 正则表达式查询通常比其他类型的查询慢,因此应谨慎使用。
自定义
其实用到的是运算符 $where
举个栗子吧,查询数据库中stu集合中age大于20的文档:
db.stu.find($where:function(){return this.age > 20})
this就代表的是当前的集合,是不是又java那味了。
常用技术
排序
排序用到是sort() 函数,必须和find()一起使用。
按名称字段升序对文档进行排序:
db.collection.find().sort({ name: 1 });
按年龄字段降序对文档进行排序:
db.collection.find().sort({ age: -1 });
按多个字段排序:
db.collection.find().sort({ name: 1, age: -1 });
里面的1就代表升序,-1代表降序。
计数
使用到了count(),返回集合中符合条件的文档的个数。
db.stu.count({'age':{$gt:20}})
上面的代码的意思就是返回集合stu中age大于20的文档的个数。
下图是对我创建按的集合hello的操作,自己看看吧:
分页
分页,就是limit()和skip()
跳过前 10 条文档并返回接下来的 20 条文档:
db.collection.find().skip(10).limit(20);
我觉得无需多言,一看便知。
投影
特性:
- 允许指定要返回的字段。
- 可以使用投影操作来减少返回的数据量,从而提高查询性能。
注意点:
- 投影操作不适用于聚合管道。
- 投影后的结果集可能不是稳定的,这意味着在多次执行相同的查询时,结果的顺序可能不同。
示例:
仅返回 name
和 age
字段:
db.collection.find({}, { projection: { name: 1, age: 1 } });
排除 _id
字段:
db.collection.find({}, { projection: { _id: 0 } });
第一个{}前面说过了,代表条件,可以为空,但不能没有。后边的加一个projection,通俗点说,1代表显示,0不显示。
aggregate(聚合)
MySQL有聚合函数,mongo有聚合框架,其实都大差不差啦,只是写法叫法不同罢了。
MongoDB 聚合框架是一个强大的工具,用于对数据进行复杂的数据转换和聚合。它允许您将多个操作管道化在一起,以执行各种数据处理任务。
语法:
db.collection.aggregate([ { $stage1: { $operation1: ... } }, { $stage2: { $operation2: ... } }, ... ]);
其中:
$stage1
和$stage2
是聚合管道阶段。$operation1
和$operation2
是聚合操作。
聚合操作:
聚合框架提供了各种聚合操作,包括:
- $group: 对文档进行分组并计算聚合值(例如求和、平均值、最大值和最小值)。
- $project: 指定要返回的字段并转换文档的结构。
- $match: 过滤文档以仅包括满足特定条件的文档。
- $sort: 按一个或多个字段对文档进行排序。
- $limit: 限制返回的文档数。
- $skip: 跳过指定数量的文档。
示例:
计算每个类别的总销售额:
db.collection.aggregate([ { $group: { _id: "$category", totalSales: { $sum: "$price" } } } ]);
按名称对文档进行分组并计算每个组的平均年龄:
db.collection.aggregate([ { $group: { _id: "$name", avgAge: { $avg: "$age" } } } ]);
注意:上面这两句price、age字段前面加了$。
过滤出年龄大于 30 岁的文档并按名称排序:
db.collection.aggregate([ { $match: { age: { $gt: 30 } } }, { $sort: { name: 1 } } ]);
聚合框架非常灵活,可以用于执行各种复杂的数据处理任务。它对于分析大数据集和提取有意义的见解非常有用。
总之,掌握一些mongo的基础操作是不难的,对于仅仅是使用的人是够的,况且现在有C老师(chatGPT)。
ok,本文结束🌹🌹🌹,我是努力的yao,不定时分享知识给大家,如果觉得我写的可以,可以关注一下。