最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang對mongodb進(jìn)行聚合查詢詳解

 更新時間:2023年02月10日 10:51:38   作者:金色旭光  
這篇文章主要為大家詳細(xì)介紹了Golang對mongodb進(jìn)行聚合查詢的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Golang有一點的幫助,需要的可以參考一下

mongodb的環(huán)境搭建參考前面一篇通過mongo-driver使用說明 GO 包管理機制

1.BSON介紹

在Go中使用BSON對象構(gòu)建操作命令

在我們發(fā)送查詢給數(shù)據(jù)庫之前, 很重要的一點是,理解Go Driver是如何和BSON對象協(xié)同工作的。

JSON文檔在MongoDB里面以二進(jìn)制形式存儲, 被稱作BSON(二進(jìn)制編碼的JSON)。不像其他的數(shù)據(jù)庫保存JSON數(shù)據(jù)為簡單的字符串和數(shù)字, BSON擴展了JSON的保存形式, 包括額外的類型, 比如int, long, date, floating point以及decimal128。這使得它讓應(yīng)用程序更容易來可靠地處理、排序和比較數(shù)據(jù)。

Go Driver有兩個系列的類型表示BSON數(shù)據(jù):D系列類型和Raw系列類型。

D系列的類型使用原生的Go類型簡單地構(gòu)建BSON對象。這可以非常有用的來創(chuàng)建傳遞給MongoDB的命令。 D系列包含4種類型:

  • – D:一個BSON文檔。這個類型應(yīng)該被用在順序很重要的場景, 比如MongoDB命令。
  • – M: 一個無需map。 它和D是一樣的, 除了它不保留順序。
  • – A: 一個BSON數(shù)組。
  • – E: 在D里面的一個單一的子項。

這里有一個使用D類型構(gòu)建的過濾文檔的例子, 它可能被用在查詢name字段匹配“Alice”或者“Bob”的文檔:

bson.D{{
    "name", 
    bson.D{{
        "$in", 
        bson.A{"Alice", "Bob"}
    }}
}}

2.過濾查詢

2.1go查詢

package main

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
)

type Student struct {
    Name string
    Score int 
}

func main() {
    // 設(shè)置客戶端連接配置
    clientOptions := options.Client().ApplyURI("mongodb://admin:123456@localhost:27017")

    // 連接到MongoDB
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // 檢查連接
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")


    collection := client.Database("demo").Collection("student")
    

    s1 := Student{"小紅", 66}
    s2 := Student{"小蘭", 70}
    s3 := Student{"小黃", 86}
    s4 := Student{"小張", 92}


    students := []interface{}{s1, s2, s3, s4}
    res, err := collection.InsertMany(context.TODO(), students)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("插入數(shù)據(jù)完成", res.InsertedIDs)

    
    aggreData := []map[string]interface{}{}

    scoreArray := [5]int{60, 70, 80, 90, 100}

  
    for i := 0; i<len(scoreArray)-1; i++{
        filter := bson.M{
            "score": bson.M{
                "$gt": scoreArray[i],
                "$lt": scoreArray[i+1],
            },
        }
        count, err := collection.CountDocuments(context.TODO(), filter)
        if err != nil {
            log.Printf("get metric error %s", err)
        }
        if count > 0 {
            temp := map[string]interface{}{}
            temp["count"] = count
            aggreData = append(aggreData, temp)
        }
    }
    
    fmt.Println("get finish!")
    for _, value := range aggreData {
        fmt.Println(value)
    }
}
admin> use demo
switched to db demo
demo> show tables
student
demo> db.student.find()
[
  { _id: ObjectId("63e25fa9c6fe361e9f5e7e6e"), name: '小紅', score: 66 },
  { _id: ObjectId("63e25fa9c6fe361e9f5e7e6f"), name: '小蘭', score: 70 },
  { _id: ObjectId("63e25fa9c6fe361e9f5e7e70"), name: '小黃', score: 86 },
  { _id: ObjectId("63e25fa9c6fe361e9f5e7e71"), name: '小張', score: 92 }
]

?  mongo go run hello.go
Connected to MongoDB!
插入數(shù)據(jù)完成 [ObjectID("63e26329b1f99ae321f895c2") ObjectID("63e26329b1f99ae321f895c3") ObjectID("63e26329b1f99ae321f895c4") ObjectID("63e26329b1f99ae321f895c5")]
get finish!
map[count:1]
map[count:1]
map[count:1]

2.2bucket命令

以上的命令其實是用來替換bucket命令。bucket命令是3.4的新功能,功能是可以對傳入的一組查詢數(shù)據(jù)分組查詢并統(tǒng)計。如傳入查詢數(shù)據(jù)為[0, 10, 20, 30],可以查詢出0~10的數(shù)據(jù),10~20的數(shù)據(jù)。

cond := make([]bson.M, 0)
cond = append(cond, bson.M{"$match": bson.M{"user_id": userID}})
cond = append(cond, bson.M{
    "$bucket": bson.D{
        bson.E{Key: "groupBy", Value: "$" + queryField},
        bson.E{Key: "default", Value: "_others_"},
        bson.E{Key: "boundaries", Value: boundries},
        bson.E{Key: "output", Value: bson.D{bson.E{Key: "count", Value: bson.M{"$sum": 1}}}},
    }})
aggreData := s.aggregateMongoQuery(collection, cond)

3.聚合查詢

3.1mongo命令使用

使用mongodb肯定離不開聚合查詢這種威力強大的操作。下面實現(xiàn)一個提取數(shù)組中元素,重命名,匹配區(qū)間,統(tǒng)計總數(shù)這樣一個操作,使用到的命令包括:

  • unwind:將數(shù)組中的每一個值拆分為單獨的文檔
  • project:提取文檔中元素或重命名
  • match:匹配文檔中元素
  • group:統(tǒng)計文檔

插入數(shù)據(jù)

demo> db.student.insert({"field": "score", "num": [12, 23, 34, 45, 56, 67, 78, 89]})
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("63e3b26b029e307c2c8c46e6") }
}

mongo命令查詢

demo> db.student.aggregate([{ $unwind:"$num"}, {$project:{value: "$num"}}, {$match: {value:{$gte: 40, $lt: 90}}}, {$group: {_id: "in_40_90", count: {$sum: 1}}}])
[ { _id: 'in_40_90', count: 5 } ]

程序就是將以上命令翻譯成go語言執(zhí)行

3.2go 聚合查詢

package main

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
)

type Student struct {
    Name string
    Score int 
}

func main() {
    // 設(shè)置客戶端連接配置
    clientOptions := options.Client().ApplyURI("mongodb://admin:123456@localhost:27017")

    // 連接到MongoDB
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // 檢查連接
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")

    collection := client.Database("demo").Collection("student")
    
    
    unwind := bson.D{{"$unwind", "$num"}}

    project := bson.D{{
        "$project", bson.D{{
            "value", "$num",
        }},
    }}

    match := bson.D{{
        "$match", bson.D{{
            "value", bson.D{{"$gte", 40}, {"$lt", 90}},
        }},
    }}

    group := bson.D{{
        "$group", bson.D{
            {"_id", nil},
            {"count", bson.D{{"$sum", 1}}},
        },
    }}
    showInfoCursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{unwind, project, match, group})

    var showsWithInfo []map[string]interface{}
    if err = showInfoCursor.All(context.TODO(), &showsWithInfo); err != nil {
        log.Printf("collection %s", err)
        panic(err)
    }

    for _, value := range showsWithInfo {
        fmt.Println(value)
    }

}

?  mongo go run hello.go
Connected to MongoDB!
map[_id:<nil> count:5]
 

可以看到結(jié)果和mongo命令是一樣的

以上就是Golang對mongodb進(jìn)行聚合查詢詳解的詳細(xì)內(nèi)容,更多關(guān)于Golang mongodb聚合查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談go中defer的一個隱藏功能

    淺談go中defer的一個隱藏功能

    這篇文章主要介紹了淺談go中defer的一個隱藏功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Golang極簡入門教程(三):并發(fā)支持

    Golang極簡入門教程(三):并發(fā)支持

    這篇文章主要介紹了Golang極簡入門教程(三):并發(fā)支持,本文講解了goroutine線程、channel 操作符等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 深入探討Go語言中的map是否是并發(fā)安全以及解決方法

    深入探討Go語言中的map是否是并發(fā)安全以及解決方法

    這篇文章主要來和大家探討?Go?語言中的?map?是否是并發(fā)安全的,并提供三種方案來解決并發(fā)問題,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-05-05
  • Go語言中的逃逸分析究竟是什么?

    Go語言中的逃逸分析究竟是什么?

    這篇文章主要介紹了Go語言中的逃逸,套喲究竟是什么呢?通俗來講,當(dāng)一個對象的指針被多個方法或線程引用時,我們稱這個指針發(fā)生了“逃逸”。下面文章將詳細(xì)介紹Go語言中的逃逸,需要的朋友可以參考一下
    2021-09-09
  • Go語言實現(xiàn)簡單Web服務(wù)器的方法

    Go語言實現(xiàn)簡單Web服務(wù)器的方法

    這篇文章主要介紹了Go語言實現(xiàn)簡單Web服務(wù)器的方法,實例分析了Web服務(wù)器的實現(xiàn)原理與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go 自定義package包設(shè)置與導(dǎo)入操作

    Go 自定義package包設(shè)置與導(dǎo)入操作

    這篇文章主要介紹了Go 自定義package包設(shè)置與導(dǎo)入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang底層原理解析String使用實例

    Golang底層原理解析String使用實例

    這篇文章主要為大家介紹了Golang底層原理解析String使用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解如何在Golang中監(jiān)聽多個channel

    詳解如何在Golang中監(jiān)聽多個channel

    這篇文章主要為大家詳細(xì)介紹了如何在Golang中實現(xiàn)監(jiān)聽多個channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Go語言實現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法實例

    Go語言實現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法實例

    這篇文章主要介紹了Go語言實現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法,實例分析了樹形結(jié)構(gòu)數(shù)據(jù)比較算法的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言中字符串拼接的方法總結(jié)

    Go語言中字符串拼接的方法總結(jié)

    在Go語言中,我們可以使用+操作符、bytes.Buffer、strings.Builder等方法來拼接字符串,本文主要為大家介紹了這些常用方法的實現(xiàn)以及性能對比,感興趣的小伙伴可以了解下
    2023-11-11

最新評論

永清县| 梅州市| 淮南市| 绵竹市| 石台县| 湾仔区| 长泰县| 道孚县| 苍溪县| 吉安市| 亚东县| 萝北县| 柳河县| 宁明县| 双鸭山市| 常山县| 博客| 舟曲县| 通辽市| 福鼎市| 宣城市| 容城县| 三穗县| 宁阳县| 闽清县| 肇东市| 义马市| 新野县| 双辽市| 乌什县| 循化| 高阳县| 孝感市| 宜兰市| 盱眙县| 康马县| 民丰县| 平遥县| 鞍山市| 寻甸| 兴城市|