1. 数据按照时间聚合操作

1.1 正常的数据结构
{
"_id" : ObjectId("5cac8d7b1202708adf5d4b64"),
"time" : ISODate("2019-04-09T20:18:03.308Z"),
"ip" : "10.10.23.2",
"metrics" : "bm",
"count" : NumberLong(3)
}
{
"_id" : ObjectId("5cac8d7c1202708adf5d4c75"),
"time" : ISODate("2019-04-09T20:18:04.062Z"),
"ip" : "10.13.23.2",
"metrics" : "bm",
"count" : NumberLong(0)
}
{
"_id" : ObjectId("5cac92a01202708adf613c88"),
"time" : ISODate("2019-04-09T20:40:00.024Z"),
"ip" : "10.13.23.2",
"metrics" : "bcc.proc.profile-bm",
"count" : NumberLong(0)
}
{
"_id" : ObjectId("5cac92a11202708adf613cb5"),
"time" : ISODate("2019-04-09T20:40:01.007Z"),
"ip" : "10.3.21.204",
"metrics" : "bcc.proc.profile-bm",
"count" : NumberLong(0)
}
1.2 mongo命令行查询

按照记录的时间指标,按照1分钟的纬度,进行统计聚合。

In the db.collection.aggregate method and db.aggregate method, pipeline stages appear in an array.

Documents pass through the stages in sequence.

aggregate函数中可以跟表达式,用到的表达式的如下所示:

$group Groups input documents by a specified identifier expression and applies the accumulator expression(s), if specified, to each group. Consumes all input documents and outputs one document per each distinct group. The output documents only contain the identifier field and, if specified, accumulated fields.

$match Filters the document stream to allow only matching documents to pass unmodified into the next pipeline stage. $match uses standard MongoDB queries. For each input document, outputs either one document (a match) or zero documents (no match).

$project Reshapes each document in the stream, such as by adding new fields or removing existing fields. For each input document, outputs one document.

$sort Reorders the document stream by a specified sort key. Only the order changes; the documents remain unmodified. For each input document, outputs one document.

db.count.aggregate(
{"$match":{ "time": {'$gte': ISODate("2019-04-09T14:00:00Z") ,'$lt':ISODate("2019-04-09T24:35:00Z")} }},
{"$group": { "_id": { "$subtract": [ { "$subtract": [ "$time", new Date("1970-01-01") ] }, { "$mod":[{"$subtract": ["$time", new Date("1970-01-01")]}, 1000 * 60 * 1 ]}]}, "total": {'$sum': '$count'}, } } ,
{"$project": { "_id": 0, 'datetime': {'$add': [new Date(0), '$_id']}, "total":1}},
{"$sort": { 'datetime': 1 }} )
1.3 golang mgo包查询:

golang 中mgo package中实现了mongo的聚合函数

func (c *Collection) Pipe(pipeline interface{}) *Pipe
For example:
pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}})
iter := pipe.Iter()

Pipe prepares a pipeline to aggregate. The pipeline document must be a slice built in terms of the aggregation framework language.

构造bson.M结构体,bson.M是map类型的定义。
这里主要解决三个问题:
1. 结构式的表达,整个结构式细分为子结构式
2. mongo $subtrace函数中需要的表达式为int类型的,主要将相应的数据类型转换为数值类型的
3. $mod表达式内部为表达式和数值的混合类型,用[]interface{}来表示, interface{}相当于C中的void*类型
m := []bson.M{}
type list []interface{}
date := time.Unix(0, 0)
sub := list{"$time", date}
sub_base := bson.M{"$subtract": sub} mode_list := list{sub_base, duration}
mode := bson.M{"$mod": mode_list} sub_array := []bson.M{}
sub_array = append(sub_array, sub_base)
sub_array = append(sub_array, mode) m = append(m, bson.M{"$match": bson.M{"time": bson.M{"$gte": bt, "$lte": et}, "ip": ip}})
m = append(m, bson.M{"$group": bson.M{"_id": bson.M{"$subtract": sub_array}, "count": bson.M{"$sum": "$count"}}}) add_list := list{date, "$_id"}
m = append(m, bson.M{"$project": bson.M{"_id": 0, "time": bson.M{"$add": add_list}, "count": 1}})
m = append(m, bson.M{"$sort": bson.M{"time": 1}})
count := make([]CountResult, 0)
err = count_db.Find(m, &count)

参考文档

  1. mongodb官方文档
  2. golang package

golang (4) golang 操作mongdb的更多相关文章

  1. golang 的 mysql 操作

    goLang的mysql操作,大致可分为三个步骤: 1.下载mysql驱动:go get github.com/go-sql-driver/mysql 2.建立连接:sql.Open("my ...

  2. Golang 调用 aws-sdk 操作 S3对象存储

    Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...

  3. 【GoLang】golang HTTP GET/POST JSON的服务端、客户端示例,包含序列化、反序列化

    服务端代码示例: package main import ( "encoding/json" "fmt" "io/ioutil" " ...

  4. 【GoLang】GoLang map 非线程安全 & 并发度写优化

    Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource.每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁 ...

  5. 【golang】golang文本处理

    golang文本字符串操作:包含 合并 连接 分割 取索引 前缀后缀检测 消除字符串 消除空格 golang字符串操作需要用到 strings这个包 str := "hello world& ...

  6. node操作mongdb的常用函数示例

    node操作mongdb的常用函数示例 链接数据库 var mongoose = require('mongoose'); //引用数据库模块 mongoose.connect('mongodb:// ...

  7. golang: 利用unsafe操作未导出变量

    unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁.uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它 ...

  8. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  9. golang的json操作

    package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct s ...

随机推荐

  1. HBase 强制删除表

    业务系统中有一张表drop不掉了. 可以disable,就是drop不掉. 解决办法: 1.将HDFS上的数据删除或移动 hadoop fs -mv /hbase/<table_name> ...

  2. Mybatis的map用法

    当Mybatis传过来的值是map类型的时候,有两种处理方法 1.将数值装入类封装起来 public interface IStudentDao { // 根据姓名和年龄查询 List<Stud ...

  3. UVa 1612 Guess (贪心+题意)

    题意:有 n 位选手参加编程比赛.比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交的越早,预得分越大). 接下来 是系统评测.如果某道题未通过测试,则 ...

  4. LDA详解

    PART 1 这个性质被叫做共轭性.共轭先验使得后验概率分布的函数形式与先验概率相同,因此使得贝叶斯分析得到了极⼤的简化.   V:文档集中不重复的词汇的数目 语料库共有m篇文档,: 对于文档,由个词 ...

  5. 20155334 2016-2017-2 《Java程序设计》第六周学习总结

    20155334 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章:输入/输出 InputStream与OutputStream java将输入/输出抽 ...

  6. java并发编程实战:第十二章---并发程序的测试

    并发程序中潜在错误的发生并不具有确定性,而是随机的. 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性 ...

  7. How To Use XDOLoader to Manage, Download and Upload Files? (DOC ID 469585.1)

    In this Document Goal Fix     Downloading Files   Uploading Files References Applies to: BI Publishe ...

  8. Lucene索引的【增、删、改、查】

    前言 搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO.并且根据倒排索引,实现快速检索.本文就简单的实现增量添加索引,删除索引,通过关键字查询,以及更新索 ...

  9. Java Web系列:Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  10. Java Web系列:JAAS认证和授权基础

    1.认证和授权概述 (1)认证:对用户的身份进行验证. .NET基于的RBS(参考1)的认证和授权相关的核心是2个接口System.Security.Principal.IPrincipal和Syst ...