MongoDB中$type、索引、聚合
最近做的项目用到了MongoDB,所以大概学了下基本操作,写的不好还请见谅。更详细的介绍请移步官网:https://docs.mongodb.com/manual/aggregation/
1、$type
1.1 说明
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
1.2 使用
插入一些数据
> 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
});
查看集合中的数据:
db.col.find().pretty()
- 如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:
db.col.find({"title" : {$type : 2}}).pretty();
或
db.col.find({"title" : {$type : 'string'}}).pretty();
上面文档中的title都是String类型的,我们插入一个数值类型的
再次执行db.col.find({“title” : {$type : 2}}).pretty();
db.col.find({"title" : {$type :1}}).pretty();
从上面的查询结果可知,MongoDB默认插入的数值类型是Double类型,我们使用int类型是查不出来的
2、索引
官方文档:https://docs.mongodb.com/manual/indexes/
2.1 说明
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
2.2 原理
从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合层面上定义了索引,并支持对MongoDB集合中的任何字段或文档的子字段进行索引。
2.3 操作
查询集合中所有数据
创建索引
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. |
按升序创建索引字段
db.users.createIndex({name:1})
查看集合索引
db.集合名称.getIndexes()
——id是默认存在的,暂时理解为主键索引吧
指定索引名称:为age字段创建索引,并指定索引名称
db.users.createIndex({age:1},{name:'age_index'})
删除集合所有索引
db.集合名称.dropIndexes()
2.4 复合索引
说明: MongoDB 支持复合索引,其中单个索引结构包含对 集合文档中多个字段引用。
创建复合索引:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
注意: mongoDB 中复合索引和传统关系型数据库一致都是左前缀原则
3、聚合
3.1 说明
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)。
3.2 使用
先在collection中插入以下数据
{
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
}
批量插入命令:
3.3 常见聚合表达式
1、根据by_user字段分组
db.tests.aggregate([{$group:{_id:'$by_user'}}])
2、分组统计每个作者的文章数
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$sum:1}}}])
3、先根据by_user字段分组,然后求每组likes字段的平均值
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$avg:'$likes'}}}])
4、先根据by_user字段分组,然后求每组likes字段的最小值
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$min:'$likes'}}}])
5、先根据by_user字段分组,然后求每组likes字段的最大值
db.tests.aggregate([{$group:{_id:'$by_user','sum_by_user':{$max:'$likes'}}}])
6、先根据by_user字段分组,再将url添加到一个数组中
db.tests.aggregate([{$group:{_id:'$by_user','url':{$push:'$url'}}}])
可以看到,上面的值并没有去重,用addToSet实现去重
db.tests.aggregate([{$group:{_id:'$by_user','url':{$addToSet:'$url'}}}])
上面参数解释的图片来自MongoDB和菜鸟教程。