golang (4) golang 操作mongdb
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)
参考文档
golang (4) golang 操作mongdb的更多相关文章
- golang 的 mysql 操作
goLang的mysql操作,大致可分为三个步骤: 1.下载mysql驱动:go get github.com/go-sql-driver/mysql 2.建立连接:sql.Open("my ...
- Golang 调用 aws-sdk 操作 S3对象存储
Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...
- 【GoLang】golang HTTP GET/POST JSON的服务端、客户端示例,包含序列化、反序列化
服务端代码示例: package main import ( "encoding/json" "fmt" "io/ioutil" " ...
- 【GoLang】GoLang map 非线程安全 & 并发度写优化
Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource.每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁 ...
- 【golang】golang文本处理
golang文本字符串操作:包含 合并 连接 分割 取索引 前缀后缀检测 消除字符串 消除空格 golang字符串操作需要用到 strings这个包 str := "hello world& ...
- node操作mongdb的常用函数示例
node操作mongdb的常用函数示例 链接数据库 var mongoose = require('mongoose'); //引用数据库模块 mongoose.connect('mongodb:// ...
- golang: 利用unsafe操作未导出变量
unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁.uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它 ...
- Golang原生sql操作Mysql数据库增删改查
Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...
- golang的json操作
package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct s ...
随机推荐
- kubernetes多节点的pod挂载同一个cephfs目录
一.安装cephfs 方法一: 直接进入deploy目录,执行: ceph-deploy --overwrite-conf mds create ceph01:mds-daemon- 上面的ceph0 ...
- linux下mysql安装和调优
1.yum yum -y install mysql-server mysql 2.RPM安装 http://dev.mysql.com/downloads/ 下载RPM包,请确认服务器版本,我的是红 ...
- struct pollfd
struct pollfd 2010年04月15日 星期四 下午 03:59 int poll (struct pollfd *fds, size_t nfds , int timeout); str ...
- handsontable-developer guide-setting options,callback
1.cell数组 cell: [ {row: 0, col: 0, readOnly: true} ] 2.cells函数 cells: function(row, col, prop){ var c ...
- vs2008快捷键极其技巧
vs2008快捷键极其技巧 1. 工具: Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM Microsoft .NET Framework V ...
- Math类的三个方法比较: floor() ceil() round()
public class Test { public static void main(String[] args) { double d1 = 3.4, d2 = 3.6; //正数 double ...
- .NET 匿名方法的BUG,请专家解答
匿名方法是.NET 3.5之后的一个好东东,很多人使用,但是我在最近的工作当中发现了一个问题. 请专家解答 //list里存放10个数字 List<); ; i < ; i++) { li ...
- 打造自己的Sublime使用环境
1.破解LICENSE(如果不是特穷还是买一个吧,不是特别贵,支持正版)----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855 ...
- Tomcat启动报错Invalid character found in method name. HTTP method names must be tokens
1.tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同. 端口一: 修改http访问端口(默认为8080端口),配置文件为 ...
- 控制 MediaElement(播放、暂停、停止、音量和速度)
控制 MediaElement(播放.暂停.停止.音量和速度) WPF中对于多媒体的支持非常完整,一般都是通过MediaElement来实现的. http://msdn.microsoft.com/z ...