$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
在使用 $type 进行查询的时候,可以使用类型对应的数字表示该类型.
注:在MongoDB中放入的数字无论是整数还是小数默认都是 Double 类型
MongoDB 中可以使用的类型如下表所示:
先插入两条数据, col表示集合的名字
db.col.insert({
title: 'PHP 教程',
description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
by: '编程不良人',
url: 'http://www.baizhiedu.xin',
tags: '看书',
likes: 200
});
db.col.insert({
title: 2233,
description: '2233 是一个 B站的',
by: '编程不良人',
url: 'http://www.baizhiedu.xin',
tags: ['2233'],
likes: 100
});
db.col.find({"title" : {$type : 2}}).pretty();
或
db.col.find({"title" : {$type : 'string'}}).pretty();
db.col.find({"tags" : {$type : 4}}).pretty();
或
db.col.find({"tags" : {$type : 'array'}}).pretty();
https://docs.mongodb.com/manual/indexes/
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合层面上定义了索引,并支持对MongoDB集合中的任何字段或文档的子字段进行索引。
0、创建索引
> db.集合名称.createIndex(keys, options) # 创建索引,keys可以写多个字段,options参数可以省略,
例:
db.集合名称.createIndex({"title":1,"description":-1});
# 为title字段按升序创建索引,为description字段按降序创建索引
db.users.createIndex({name:1}); # 为 name 字段升序创建索引
db.users.createIndex({age:1},{name:'age_index'}); # 为 age 字段升序创建索引且指定索引名字
db.users.createIndex({name:1},{name:'name_index',expireAfterSeconds:15});
# 为 name 字段升序创建索引且指定索引名字且指定索引过期的时间
说明: 语法中 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. |
1、查看集合索引
> db.集合名称.getIndexes()
例:
db.users.getIndexes();
2、查看集合索引大小
> db.集合名称.totalIndexSize()
例:
db.users.totalIndexSize();
3、删除集合所有索引
> db.集合名称.dropIndexes()
例:
db.users.dropIndexes(); # 删除集合中所有索引, 注意:不包括 _id 这个字段的索引
4、删除集合指定索引
> db.集合名称.dropIndex("索引名称")
例:
db.users.dropIndex('name_index'); # 删除users集合中索引名字为 'name_index' 的索引
说明: 一个索引的值是由多个 key 进行维护的索引的称之为复合索引
> db.集合名称.createIndex({"title":1,"description":-1})
例:
db.users.createIndex({name:1,age:-1},{name:'name_age_index'});
# 创建 name字段和age字段 的复合索引,且指定这个复合索引的名字
注意: mongoDB 中复合索引和传统关系型数据库一致都是左前缀原则
排序也是利用到了索引的
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)。
# 先在tests集合中插入下面三条记录
db.tests.insert({
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.tests.insert({
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
});
db.tests.insert({
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
});
现在我们计算以上集合每个作者所写的文章数,使用**aggregate()**计算结果如下:
> db.集合名称.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]);
例:
db.tests.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]);
$group 表示分组
_id : "$by_user" 中 $by_user 表示以哪个字段进行分组
num_tutorial 表示给分组之后的结果起一个名字
$sum : 1 表示对分组之后的结果进行求和,后面的数字表示对求和的结果乘以几