惬意上手MongoDB

上一篇文章介绍了MySQL,今天来介绍一下MongoDB,相较于MySQL而言,它是简单的。

简介

MongoDB是一种开源的、跨平台的文档数据库,采用NoSQL数据库的形式。它以高性能、高可用性和灵活的数据模型而闻名,适用于大规模数据存储和处理。MongoDB使用BSON(Binary JSON)格式存储数据,支持复制、故障转移、自动分片等功能,被广泛应用于Web应用程序、大数据分析等领域。

简单说,它是一种非关系型数据库(NoSQL),采用json格式的数据进行存储。

它通常不需要像MySQL那样操作前还需要进行登录,但也可以创建具有不同权限的用户。

安装

安装过程比较简单,这里我直接放一个官方安装教程,需要的同志可以跳转。

官方安装教程icon-default.png?t=N7T8https://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的名字):

db.dropDatabase()

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 中的更新操作符,用于将数字字段增加指定的值。

查询条件

比较运算符
$eqequal 等于

$ne

not equal 不等于
$gtgreater than 大于
$ltless than 小于
$gtegreater than equal 大于等于
$lteless 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);

我觉得无需多言,一看便知。 

投影

特性:

  • 允许指定要返回的字段
  • 可以使用投影操作来减少返回的数据量,从而提高查询性能。

注意点:

  • 投影操作不适用于聚合管道。
  • 投影后的结果集可能不是稳定的,这意味着在多次执行相同的查询时,结果的顺序可能不同。

示例:

仅返回 nameage 字段:

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,不定时分享知识给大家,如果觉得我写的可以,可以关注一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值