MongoDB学习笔记(二)常用操作和操作符

本文最后更新于:December 3, 2021 pm

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。是一个面向文档存储的数据库,操作起来比较简单和容易。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

目录

数据库:loong
集合(表):to
字段:loongID、username、descr

1.更新文档

1.$set

db.collectionName.update({查询条件},{更新内容},{更新参数(可选)})

用于更新函数update()中。注意:IDEA中似乎update()函数已经不能使用了,需要用replaceOne替换update()。
例如:

1
2
3
4
db.to.update({username:"test"},{loongID:"100"}) //失败
//报错:java.lang.IllegalArgumentException: Invalid BSON field name loongID Invalid BSON field name loongID

db.to.replaceOne({username:"test"},{loongID:"100"}) //成功

我们知道,用此方法修改后,除了后面的:loongID:”100” 字段会保留外 。其他的字段数据都被清空了。因为他会完全根据你提供的修改字段数据进行修改,你提供什么,它就修改什么(即:之前没有的,它会自动创建)。你多它就多,你少他就少。所以,这种方法的使用比较麻烦,修改一处就需要把所有的字段数据都写出来,不管你改不改。你不写就表示不要了,就自动给你清空了。

这时候就可以用$set来解决。它就可以用来实现只修改提供的字段数据,其他的不变。如果提供的数据没有,则会自动创建。
格式:

1
db.to.updateOne({条件},{$set:{待修改数据}})

注意:在IDEA中,使用$set时,又使用replaceOne()是不行的,会报错,所以改用了updateOne()。
例子:

1
2
3
4
db.to.replaceOne({loongID:"101"},{$set:{username:"lllllll"}}) //失败
//报错:java.lang.IllegalArgumentException: Invalid BSON field name $set Invalid BSON field name $set

db.to.updateOne({loongID:"101"},{$set:{username:"lllllll"}}) //成功,且除被修改字段外,其他字段并没有清空

1.1 批量更新

上面的这种使用方法还有一个缺点,就是当查询结果有多条时,只会修改第一条。这时候就需要用到第三个参数了。使用 multi 参数实现批量更新,它是一个布尔值,默认为false。

注意:在IDEA中我使用了:updateOne()、replaceOne()、update()方法都不行。然后我在命令行中进行的。

数据库中,有两条loongID为101的。

1
2
//在命令窗口中运行的
db.to.update({loongID:"101"},{$set:{username:"test"}},{multi:true})

这样就同时修改了两条数据的username字段。

2.$unset

用来删除键。

1
db.to.updateOne({loongID:"100"},{$unset:{lll:1}}) //删除键lll

注意:后面那个1只是用来占位的而已,也可以写成其他的0、100等。这样写上,只是为了符合这种结构。

3.$inc

对文档的某个值为数字型的键进行增减操作。(只能是满足要求的数字类型)

1
2
db.to.updateOne({loongID:"101"},{$inc:{age:2}}) //加2
db.to.updateOne({loongID:"101"},{$inc:{age:-2}}) //加-2

4.$push

向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时,若键存在,则键值类型必须是数组;若键不存在,则会自动创建数组类型的键。

1
db.to.update({title:"qwer"},{$push:{tags:"Mongo"}})

5.$pop

删除数据元素。1表示从数组的尾部删除,-1表示从数组的头部删除。

1
2
db.to.update({title:"qwer"},{$pop:{tags:1}}) 
db.to.update({title:"qwer"},{$pop:{tags:-1}})

6.$pull

从数组中删除满足条件的元素。

1
db.to.update({title:"qwer"},{$pull:{tags:"MongoDB"}}) //删除满足是MongoDB的

7.$pullAll

从数组中删除满足条件的多个元素。

1
db.to.update({title:"qwer"},{$pullAll:{"tags":["MongoDB","DB"]}})

8.$rename

对键进行重新命名。

1
db.to.update({title:"qwer"},{$rename:{"tags":"tag"}})

2.删除文档

2.1 deleteOne()函数

官方推荐删除文档方法。用来只删除满足条件的第一条文档。

1
db.to.deleteOne({title:"qwer"})

2.2 deleteMany()函数

官方推荐删除文档方法。用来删除满足条件的所有数据。

1
db.to.deleteMany({titile:"qwer"})

2.3 删除集合中所有函数

remove()函数、deleteMany()函数(推荐)。

1
2
db.to.remove({})
db.to.deleteMany({}) //推荐使用

3.查询文档

3.1 find()函数

find({查询条件(可选)},{指定投影的键(可选)}) 。pretty()函数可以使用格式化的方式来显示所有文档。

1
2
db.to.find().pretty()
db.to.find({title:"qwer"}).pretty()

3.2 findOne()函数

只返回满足条件的第一条数据。如果未做投影操作,该方法则自带格式化功能。如果不写查询条件,则只会返回所有数据中的第一条。

findOne({查询条件(可选)},{投影操作(可选)})。

1
2
db.to.findOne()
db.to.findOne({title:"qwer"})

3.3 模糊查询

使用//与^$实现模糊查询,注意使用模糊查询时查询条件不能放到双引号或单引号中。

示例:

  1. 包含a内容的。
1
db.to.find({title:/a/})
  1. a开头的。
1
db.to.find({title:/^a/})
  1. a结尾的。
1
db.to.find({title:/a$/})

3.4 投影操作

3.4.1 find()函数投影操作

在find()函数中,我们可以指定投影键。

find({查询条件},{投影键名:1|0,投影键名:1|0,….}) ,其中,1表示显示,0表示不显示。其中,_id是默认显示的,若想不显示,则必须要指定为0。

1
db.to.find({},{title:1,_id:0}) //查询所有数据中的title

3.4.2 findOne()函数投影操作

同find()函数一样,可以指定投影键。需要注意的是,这里的findOne()函数不再会格式化输出。

findOne({查询条件},{投影键名:1|0,投影键名:1|0}….)

1
db.to.findOne({username:"test"},{age:1,descr:1})

4.条件操作符

用于两个表达式。例如:find({键:{操作符:条件}})或者findOne({键:{操作符:条件}})

4.1 大于($gt)

可以对数字或日期进行判断。

1
db.to.find({age:{$gt:20}}) //查询age大于20的

4.2 小于($lt)

可以对数字或日期进行判断。

1
db.to.find({age:{$lt:20}}) //查询age小于20的

4.3 大于等于($gte)

可以对数字或日期进行判断。

1
db.to.find({age:{$gte:20}}) //查询age大于等于20的

4.4 小于等于($lte)

可以对数字或日期进行判断。

1
db.to.find({age:{$lte:20}}) //查询age小于等于20的

4.5 等于($eq)

1
db.to.find({age:{$eq:20}}) //查询age等于20的

4.5 不等于($ne)

1
db.to.find({age:{$ne:20}}) //查询age不等于20的

4.6 $and

用来表示多条件间的并且关系。

find({$and:[{条件一},{条件二},….]})

  • 如果在查询中给定了多个查询条件,条件之间的关系默认为and关系。(同一个键)
1
db.to.find({size:{$gt:100,$lt:300}}) //查询size大于100小于300的

这种方式只能针对同一个键。不同键之间的还需要使用$and

1
2
db.to.find({$and:[{size:{$gt:100}},{size:{$lt:300}}]}) //还是上面的需求
db.to.find({$and:[{size:{$gt:100}},{age:{$lt:20}}]})

4.7 $or

find({$or:[{条件一},{条件二},….]})

使用方法同$and一样。

4.8 $type

来检索集合中匹配的数据类型,并返回结果。

1
db.to.find({title:{$type:"number"}}) //查询title的值的类型为number类型的

5.Limit函数和Skip函数

5.1 Limit函数

用来指定数量的数据记录条数。

db.to.find.limit(count)

1
db.to.find({},{title:1,_id:0}).limit(2) //输出2条数据

5.2 Skip函数

用来跳过指定数量的数据,即从哪一条数据开始读取。

db.to.find().skip(count) 。也可以和limit联合使用:db.to.find().limit(number).skip(count) 。调用的位置没有顺序,可以任意写。skip写在前面,limit写在后面可能会比较好理解一些。他们都表示:跳过几条数据,再输出几条。

6.排序

使用sort()函数对查询到的文档进行排序,sort()函数可以通过参数指定排序的字段,并使用1(升序)和-1(降序)来指定排序的方式。

db.to.find().sort({排序键名:1})

1
db.to.find().sort({age:-1})

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/4031694772.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!