談談一些關於mgo的用法

前言

最近在項目中使用mongodb進行簡單的數據分析,在使用mongodb驅動mgo時遇到一些問題,好比在mongodb中執行命令成功,到了mgo中就執行失敗。在這裏談一談實踐過程當中遇到的問題,基礎的用法再也不說明了,能夠自行百度。mongodb

使用

查找(Find)

這個估計是mongodb裏用的最多的了吧,mgo中使用Find(query interface{}),query參數通常傳入[]bson.M。下面給個例子:bash

m := bson.M{
        "CurTimestamp": bson.M{
            "$gte": start,
            "$lte": end,
        },
        "Account":    account,
        "ToNodeType": "cloud",
    }
    session.DB("db").C("collect").Find(m).Count()

這裏查找時間戳內,帳號爲account,節點類型爲cloud的數據並統計個數。session

聚合管道(Aggregation Pipeline)

聚合管道在mgo中爲Pipe(pipeline interface{}) ,這個和bash中使用的管道很像,數據能夠被層層處理。通常傳入的參數爲[]bson.M。這個[]bson.M裏若是還有嵌套則還要使用[]bson.M(剛開始使用就被坑了一下)。好比這裏首先匹配節點類型和帳號,時間戳在一段時間內,而後根據名字分組統計數量,最後排序取最前面的三個。函數

//這個就能夠傳入Pipe
   m := []bson.M{
        {"$match": bson.M{"NodeType": "cloud", "Account": account, "CurTimestamp": bson.M{"$gte": start, "$lte": end}}},
        {"$group": bson.M{"_id": "$TagName", "count": bson.M{"$sum": 1}}},
        {"$sort": bson.M{"count": -1}},
        {"$limit": 3},
    }
    //這裏就能夠取到輸出的數據
    var values []result
    session.DB("db").C("collect").Pipe(m).All(&values)

數據是一層一層過濾下來的。固然mongodb中的聚合命令不止這些,用法大同小異this

MapReduce

若是要實現一些高級功能,mongodb的基本命令知足不了你,可能就要使用這個了。mongodb中要實現MapReduce就要實現Map函數和Reduce函數,Map函數調用emit將key和value傳給Reduce函數處理。這裏給的例子首先計時間戳在哪一個時間範圍內,而後累加這個值,js不是很精通,寫的很差請見諒。code

m := new(mgo.MapReduce)
    m.Map = `function() { var date = new Date();
    date.setTime(this.CurTimestamp / 1000);
    var hour = date.getHours();
    if((hour >= 6) && (hour <= 11)) {
        result.morning++;
    }else if((hour >= 12) && (hour <= 18)){
        result.afternoon ++;
    }else if((hour >= 19) && (hour <= 23)) {
        result.night ++;
    }else{
        result.am ++;
    }
    emit(this.Account, {});}`
    m.Reduce = `function() {return result;}`
    m.Scope = bson.M{
        "result": bson.M{
            "morning":   0,
            "afternoon": 0,
            "night":     0,
            "am":        0,
        },
    }
    var value []timeResult
    session.DB("db").C("collect").Find().MapReduce(m, &value)

這裏的map函數負責計算時間戳範圍,result是引入的外部變量。這裏就能夠計算出這個帳號產生數據的時間範圍統計。排序

結語

其實用多了之後就基本能熟練使用了,重要仍是瞭解mogodb命令的使用。ip

相關文章
相關標籤/搜索