前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB入门(三)

MongoDB入门(三)

原创
作者头像
传说之下的花儿
发布2023-11-25 20:04:57
1860
发布2023-11-25 20:04:57
举报

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

  1. $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 }
  1. $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 }
  1. $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" : "李四" }
  1. $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" ] }
  1. $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" : [ ] }
  1. $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 -1.

Max key

127

6. MongoDB Limit+Skip+sort

  1. Limit()

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

语法:

代码语言:shell
复制
db.COLLECTION_NAME.find().limit(NUMBER)
  1. Skip()

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

skip() 方法脚本语法格式如下:

代码语言:shell
复制
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
# 会跳过第一条,显示第二条符合条件的文档
db.hyy.find({},{name:'hyy'}).limit(1).skip(1)
  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在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

  1. 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 秒左右删除。
代码语言:shell
复制
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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4. MongoDB $
    • 4.1 条件操作符
      • 4.2 update修改器
      • 5. MongoDB $type 操作符
      • 6. MongoDB Limit+Skip+sort
      • 7. MongoDB 索引
      相关产品与服务
      云数据库 MongoDB
      腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com