4. MongoDB $
4.1 条件操作符
$ 关键字:$gt,$gte,$lt,$lte,$ne
MongoDB中条件操作符有:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
4.2 update修改器
$ 修改器:$inc,$set,$push,$pull,$pop
- $inc :
将查询到的结果 加上某一个值 然后保存
代码语言:shell复制{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 123 }
> db.student.update({"age":123},{$inc:{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({"name":"李四"})
{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 124 }
- $set :
更新字段,没有该字段就自动添加
代码语言:shell复制{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 124 }
# 为李四添加字段score 并赋值为544
> db.student.update({"name":"李四"},{$set:{"score":544}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({"name":"李四"})
{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 124, "score" : 544 }
- $unset :
用来删除key(field)的,删除指定字段
代码语言:shell复制{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 124, "score" : 544 }
# 删除李四的age字段
> db.student.update({"name":"李四"},{$unset:{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({"name":"李四"})
{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四" }
- $push :
为Array/list 类型追加数据
代码语言:shell复制{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ "sb", "dsb" ] }
> db.student.update({"name":"hyy",age:22},{$push:{"nike_name":"dddsb"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ "sb", "dsb", "dddsb" ] }
- $pull:
指定删除Array中的某一个元素,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
代码语言:shell复制{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ "sb", "sb" ] }
> db.student.update({"name":"hyy",age:22},{$pull:{"nike_name":"sb"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ ] }
- $pop :
指定删除Array/list中的第一个 或 最后一个 元素,-1 代表最前面, 1 代表最后边
代码语言:shell复制{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ "1", "2" ] }
> db.student.update({"name":"hyy","age":22},{$pop:{"nike_name":-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ "2" ] }
5. MongoDB $type 操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
代码语言:shell复制# 查询集合hyy中 name 为string类型的文档
> db.hyy.find({name:{$type:2}}).pretty()
{
"_id" : ObjectId("6190d51bd49aaba0dd8f0209"),
"name" : "胡宇洋",
"age" : "1564",
"website" : "www.hyydbs.xyz"
}
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with |
Max key | 127 |
6. MongoDB Limit Skip sort
- Limit()
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
语法:
代码语言:shell复制db.COLLECTION_NAME.find().limit(NUMBER)
- Skip()
我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
skip() 方法脚本语法格式如下:
代码语言:shell复制>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
# 会跳过第一条,显示第二条符合条件的文档
db.hyy.find({},{name:'hyy'}).limit(1).skip(1)
- 排序sort()
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,
并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。sort()方法基本语法如下所示:
代码语言:shell复制> db.COLLECTION_NAME.find().sort({KEY:1})
# 查询school是河南科技学院的文档,并按照age 降序排列
db.hyy.find({school:'河南科技学院'}).sort({age : -1})
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
7. MongoDB 索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
- createIndex() 方法
MongoDB使用 createIndex() 方法来创建索引,默认按照“_id”字段的升序创建index
格式如下:
代码语言:shell复制>db.collection.createIndex(keys, options)
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
实例:
代码语言:shell复制# 添加数据
> var document = ({name:'xxxx1',age:20,website:'www.hyydbs.xyz'})
> var document01 = ({name:'xxxx2',age:15,website:'www.hyydbs.xyz'})
> var document02 = ({name:'xxxx3',age:18,website:'www.hyydbs.xyz'})
> db.hyy.insertMany([document,document01,document02])
# 创建索引
> db.hyy.createIndex({"age":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
代码语言:shell复制>db.hyy.createIndex({"name":1,"age":-1})
1、查看集合索引
代码语言:txt复制db.hyy.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "hyy.hyy"
},
{
"v" : 1,
"key" : {
"age" : 1
},
"name" : "age_1",
"ns" : "hyy.hyy"
}
]
2、查看集合索引大小
代码语言:txt复制db.col.totalIndexSize()
3、删除集合所有索引
代码语言:txt复制db.col.dropIndexes()
4、删除集合指定索引
代码语言:txt复制db.col.dropIndex("age_1“)
用法:
利用 TTL 集合对存储的数据进行失效时间设置:
经过指定的时间段后或在指定的时间点过期,MongoDB 独立线程去清除数据。
类似于设置定时自动删除任务,可以清除历史记录或日志等前提条件,设置 Index 的关键字段为日期类型 new Date()。
例如数据记录中 createDate 为日期类型时:
- 设置时间180秒后自动清除。
- 设置在创建记录后,180 秒左右删除。
db.hyy.createIndex({"createDate": 1},{expireAfterSeconds: 180})
由记录中设定日期点清除。
设置 A 记录在 2019 年 1 月 22 日晚上 11 点左右删除,A 记录中需添加 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 Index中expireAfterSeconds 设值为 0。
代码语言:shell复制db.hyy.createIndex({"ClearUpDate": 1},{expireAfterSeconds: 0})
其他注意事项:
- 索引关键字段必须是 Date 类型。
- 非立即执行:扫描 Document 过期数据并删除是独立线程执行,默认 60s 扫描一次,删除也不一定是立即删除成功。
- 单字段索引,混合索引不支持。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!