前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB中$type、索引、聚合

MongoDB中$type、索引、聚合

作者头像
别团等shy哥发育
发布2023-02-25 14:23:44
1.6K0
发布2023-02-25 14:23:44
举报
文章被收录于专栏:全栈开发那些事

MongoDB中$type、索引、聚合

最近做的项目用到了MongoDB,所以大概学了下基本操作,写的不好还请见谅。更详细的介绍请移步官网:https://docs.mongodb.com/manual/aggregation/

1、$type

1.1 说明

  $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

  MongoDB 中可以使用的类型如下表所示:

image-20220109193244651
image-20220109193244651

1.2 使用

插入一些数据

代码语言:javascript
复制
> db.col.insert({
    title: 'PHP 教程', 
    description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
    by: '编程不良人',
    url: 'http://www.baizhiedu.xin',
    tags: ['php'],
    likes: 200
});

> db.col.insert({
    title: 'Java 教程', 
    description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
    by: '编程不良人',
    url: 'http://www.baizhiedu.xin',
    tags: ['java'],
    likes: 550
});

> db.col.insert({
    title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '编程不良人',
    url: 'http://www.baizhiedu.xin',
    tags: ['mongodb'],
    likes: 100
});

> db.col.insert({
    title: 2233, 
    description: '2233 是一个 B站的',
    by: '编程不良人',
    url: 'http://www.baizhiedu.xin',
    tags: ['2233'],
    likes: 100
});
image-20220109193443921
image-20220109193443921

查看集合中的数据:

代码语言:javascript
复制
db.col.find().pretty()
image-20220109193543175
image-20220109193543175
  • 如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:
代码语言:javascript
复制
db.col.find({"title" : {$type : 2}}).pretty();
或
db.col.find({"title" : {$type : 'string'}}).pretty();
image-20220109193650906
image-20220109193650906

上面文档中的title都是String类型的,我们插入一个数值类型的

image-20220109193745568
image-20220109193745568

再次执行db.col.find({“title” : {$type : 2}}).pretty();

image-20220109193805175
image-20220109193805175
代码语言:javascript
复制
db.col.find({"title" : {$type :1}}).pretty();
image-20220109193904102
image-20220109193904102
image-20220109193911517
image-20220109193911517

从上面的查询结果可知,MongoDB默认插入的数值类型是Double类型,我们使用int类型是查不出来的

2、索引

官方文档:https://docs.mongodb.com/manual/indexes/

2.1 说明

  索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

2.2 原理

image-20220109194146317
image-20220109194146317

  从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合层面上定义了索引,并支持对MongoDB集合中的任何字段或文档的子字段进行索引。

2.3 操作

查询集合中所有数据

image-20220109194526390
image-20220109194526390

创建索引

代码语言:javascript
复制
 db.集合名称.createIndex(keys, options)
 db.集合名称.createIndex({"title":1,"description":-1})

说明: 语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

createIndex() 接收可选参数,可选参数列表如下:

Parameter

Type

Description

background

Boolean

建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。

unique

Boolean

建立的索引是否唯一。指定为true创建唯一索引。默认值为false.

name

string

索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。

sparse

Boolean

对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.

expireAfterSeconds

integer

指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。

v

index version

索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。

weights

document

索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。

default_language

string

对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语

language_override

string

对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

按升序创建索引字段

代码语言:javascript
复制
db.users.createIndex({name:1})
image-20220109194511209
image-20220109194511209

查看集合索引

代码语言:javascript
复制
db.集合名称.getIndexes()
image-20220109194645164
image-20220109194645164

——id是默认存在的,暂时理解为主键索引吧

指定索引名称:为age字段创建索引,并指定索引名称

代码语言:javascript
复制
db.users.createIndex({age:1},{name:'age_index'})
image-20220109194848287
image-20220109194848287

删除集合所有索引

代码语言:javascript
复制
 db.集合名称.dropIndexes()
image-20220109194939897
image-20220109194939897

2.4 复合索引

说明: MongoDB 支持复合索引,其中单个索引结构包含对 集合文档中多个字段引用。

创建复合索引:

代码语言:javascript
复制
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

注意: mongoDB 中复合索引和传统关系型数据库一致都是左前缀原则

image-20220109195348056
image-20220109195348056

3、聚合

3.1 说明

  MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)

3.2 使用

先在collection中插入以下数据

代码语言:javascript
复制
{
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
}

批量插入命令:

image-20220109200028910
image-20220109200028910

3.3 常见聚合表达式

image-20220109195959679
image-20220109195959679

1、根据by_user字段分组

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user'}}])
image-20220109200119434
image-20220109200119434

2、分组统计每个作者的文章数

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$sum:1}}}])
image-20220109200155038
image-20220109200155038

3、先根据by_user字段分组,然后求每组likes字段的平均值

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$avg:'$likes'}}}])
image-20220109200255370
image-20220109200255370

4、先根据by_user字段分组,然后求每组likes字段的最小值

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$min:'$likes'}}}])
image-20220109200534273
image-20220109200534273

5、先根据by_user字段分组,然后求每组likes字段的最大值

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$max:'$likes'}}}])
image-20220109200607026
image-20220109200607026

6、先根据by_user字段分组,再将url添加到一个数组中

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','url':{$push:'$url'}}}])
image-20220109200913277
image-20220109200913277

可以看到,上面的值并没有去重,用addToSet实现去重

代码语言:javascript
复制
db.tests.aggregate([{$group:{_id:'$by_user','url':{$addToSet:'$url'}}}])
image-20220109201000349
image-20220109201000349

上面参数解释的图片来自MongoDB和菜鸟教程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB中$type、索引、聚合
  • 1、$type
    • 1.1 说明
      • 1.2 使用
      • 2、索引
        • 2.1 说明
          • 2.2 原理
            • 2.3 操作
              • 2.4 复合索引
              • 3、聚合
                • 3.1 说明
                  • 3.2 使用
                    • 3.3 常见聚合表达式
                    相关产品与服务
                    云数据库 MongoDB
                    腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档