005.MongoDB索引及聚合
一 MongoDB 索引
1.1 createIndex() 方法
> db.collection.createIndex(keys, options)
- Key :key值为你要创建的索引字段;
- options:options为1 表示按升序创建索引,为-1表示按降序来创建索引。
[root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
> use mydb
> db.age01.createIndex({age: 1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.age01.createIndex({age: 1, tel: -1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
1.2 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.age01.createIndex({age: 1, tel: -1},{background: 'true'})
{
"numIndexesBefore" : 3,
"numIndexesAfter" : 3,
"note" : "all indexes already exist",
"ok" : 1
}
1.3 查看索引
> db.age01.getIndexes()
1.4 查看集合索引大小
> db.age01.totalIndexSize()
1.5 删除指定集合
> db.age01.dropIndex('age_1_tel_-1')
{ "nIndexesWas" : 3, "ok" : 1 }
1.6 删除所有索引
> db.age01.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
二 MongoDB聚合
2.1 aggregate() 方法
> db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
[root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
> use mydb
> db.age01.aggregate([{$group: {_id: "$tel", tel: {$sum: 1}}}])
{ "_id" : "123456784", "tel" : 1 }
{ "_id" : "188888888", "tel" : 2 }
{ "_id" : "155555555", "tel" : 1 }
2.2 聚合表达式
|
表达式
|
描述
|
实例
|
|
$sum
|
计算总和。
|
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
|
|
$avg
|
计算平均值
|
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
|
|
$min
|
获取集合中所有文档对应值得最小值。
|
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
|
|
$max
|
获取集合中所有文档对应值得最大值。
|
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
|
|
$push
|
在结果文档中插入值到一个数组中。
|
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
|
|
$addToSet
|
在结果文档中插入值到一个数组中,但不创建副本。
|
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
|
|
$first
|
根据资源文档的排序获取第一个文档数据。
|
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
|
|
$last
|
根据资源文档的排序获取最后一个文档数据
|
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
|
三 管道
3.1 管道的概念
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
[root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
> use mydb
> db.age01.aggregate({$project: {name: 1, tel: 1,}}).pretty()

> db.age01.aggregate([{$match : {age: {$gt: '10', $lt: '20'}}},{$group: {_id: null, count: {$sum: 1}}}])
{ "_id" : null, "count" : 2 } #$match过滤出符合条件的数据,然后$group进行再次处理。
3.2 时间聚合
db.getCollection('m_msg_tb').aggregate(
[
{$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
{$group: {
_id: {$dayOfMonth:'$mark_time'},
pv: {$sum: 1}
}
},
{$sort: {"_id": 1}}
])
- $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
- $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
- $dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
- $year: 返回该日期的年份部分。
- $month: 返回该日期的月份部分( 1 到 12)。
- $week: 返回该日期是所在年的第几个星期( 0 到 53)。
- $hour: 返回该日期的小时部分。
- $minute: 返回该日期的分钟部分。
- $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
- $millisecond:返回该日期的毫秒部分( 0 到 999)。
- $dateToString: { $dateToString: { format: , date: } }。
005.MongoDB索引及聚合的更多相关文章
- MongoDB索引、聚合
用$where可以执行任意的js作为查询的一部分. db.foo.find({"$where" : function(){ for(var current in ...
- MongoDB的备份和部署 高级功能索引,聚合复制,分片
创建备份 MongoDB 数据转储 为了在 MongoDB 中创建数据库备份,需要使用 mongodump 命令.该命令会将服务器上的所有数据都转储到 dump 目录中.你可以使用很多选项来限制转储的 ...
- mongodb-$type、limit、skip、sort方法、索引、聚合
一.$type操作符 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1 String 2 ...
- MongoDB索引管理
一.创建索引 创建索引使用db.collectionName.ensureIndex(...)方法进行创建: 语法: >db.COLLECTION_NAME.ensureIndex({KEY:1 ...
- [DataBase] MongoDB (7) MongoDB 索引
MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- MongoDB索引(一)
原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...
- MongoDB 索引篇
MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
随机推荐
- webpack 打包less文件配置
1 npm install less less-loader -D 2匹配规则
- webpack安装错误 ‘webpack : 无法加载文件’
- Spring Boot 2.X 国际化
国际化文件的编写 messages.properties init project 7月前 messages_en_US.properties init project 7月前 messages_zh ...
- ConcurrentHashMap(1.7)分析
1. 先来了解ConcurrentHashMap中的几个成员,当然大多数与HashMap中的相似,我们只看独有的成员 /** * The default concurrency level for ...
- weed3-2.1.开始纯java使用
Weed3 一个微型ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 纯java使用 ...
- 浅析JNDI注入Bypass
之前在Veracode的这篇博客中https://www.veracode.com/blog/research/exploiting-jndi-injections-java看到对于JDK 1.8.0 ...
- 分布式图数据库 Nebula Graph 中的集群快照实践
1 概述 1.1 需求背景 图数据库 Nebula Graph 在生产环境中将拥有庞大的数据量和高频率的业务处理,在实际的运行中将不可避免的发生人为的.硬件或业务处理错误的问题,某些严重错误将导致集群 ...
- 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐
本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...
- 并发编程~~~多线程~~~线程queue, 事件event,
一 线程queue 多线程抢占资源,只能让其串行. 互斥锁 队列 import queue q = queue.Queue() # 先进先出 q = queue.LifoQueue() # 先进后出 ...
- java中文件复制的4种方式
今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...