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 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
随机推荐
- VM虚拟机与本地网络互通配置
一.设置虚拟机网络 1. 查看虚拟机网络NAT设置(VMnet8) 2. 设置虚拟机网络适配器为NAT模式 三.设置本机VMnet8网络属性 三.设置Linux网络属性 1. 查看 ip addr 2 ...
- 版本控制工具——Git常用操作
本文引自:https://juejin.im/post/5c206f1bf265da615114c15a
- [转]RPA Developer Advanced Certification - Exam #1 UiPath 练习
本文转自:https://github.com/miyaichi/CertificationExam1 RPA Developer Advanced Certification - Exam #1 E ...
- 一、VUE项目BaseCms系列文章:项目介绍与环境配置
一.项目效果图预览: 二.项目介绍 基于 elementui 写一个自己的管理后台.这个系列文章的目的就是记录自己搭建整个管理后台的过程,希望能帮助到那些入门 vue + elementui 开发的小 ...
- 基于Redis扩展模块的布隆过滤器使用
什么是布隆过滤器?它实际上是一个很长的二进制向量和一系列随机映射函数.把一个目标元素通过多个hash函数的计算,将多个随机计算出的结果映射到不同的二进制向量的位中,以此来间接标记一个元素是否存在于一个 ...
- Appium(四):真实机第一个appium程序、模拟器第一个appium程序、查看元素
1. 真实机第一个appium程序 学完了前面的知识,也将环境搭建好了,接下来我们就正式开始appium的学习了. 在做app自动化的时候,我们肯定是针对某个产品.某个软件进行测试,那么我们一定是先让 ...
- Leaving Google for a couple of devices-Kasper Lund
原文链接https://medium.com/@kasper.lund/building-for-billions-bcb48814d864 一年多以前,我辞去了我在Google的出色工作,离开了一群 ...
- 22(8).模型融合---RegionBoost
在adaboost当中,样本的权重alpha是固定的,蓝色五角星所在的圈中3个○分错了,红色五角星所在的圈中4个×和1个○都分对了,很容易让人想到,这个模型,对于红色位置的判断更加可信. 动态权重,每 ...
- JS时间戳与时间字符串之间的相互转换
时间字符串 转 时间戳 /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-07-10 10:21:12") * ...
- 【oracle】ORA-06550 字符串长度限制在范围
number(2)输入了100 就会导致异常