美文网首页Golang
mgo的一些用法

mgo的一些用法

作者: 小胖_白银狮子 | 来源:发表于2017-11-17 15:51 被阅读782次

    最近的项目在用mongodb,使用了mgo作为驱动,这里分享一些用法。
    首先mgo的地址:

     https://gopkg.in/mgo.v2
    

    配套的bson地址:

    https://gopkg.in/mgo.v2/bson
    

    链接的方法很简单,有正确的mongodb的url就可以了。
    这里说一下mgo的一些操作,mgo的操作都是基于bson。可以说操作mongo的过程就是一个控制bson结构体的过程,golang中构建一个bson的结构体是非常简单的,如:

    // Tag 标签类
    type Tag struct {
        ID            bson.ObjectId  `bson:"_id"`
        TagName       string  `bson:"tag_name"`
        TagVal        interface{}  `bson:"tag_val"`
        TagGroup      []int     `bson:"tag_group"`
    }
    

    这里要注意的是,用ID作为查询条件的时候,必须转换成ObjectId对象。如;

      bson{"_id":bson.ObjectIdHex("xxxxxxxxxxxxx")}
    

    bson是可以嵌套的,因此我们可以组合出一个非常复杂的查询,如:

    o1 := bson.M{
            "$match" :bson.M {"source":"..."},
    }
    
    o2 := bson.M{
        "$unwind": "$comments",
    }
    
    o3 := bson.M{
        "$group": bson.M{
            "_id": "$url",
            "size": bson.M{
                "$sum": 1,
            },
        },
    }
    
    o4 := bson.M{
        "sort": bson.M{
            "size": -1,
        },
    }
    
    o5 := bson.M{
        "$limit": 5,
    }
    
    operations := []bson.M{o1, o2, o3, o4, o5}
    
    pipe := c.Pipe(operations)
    
    // Run the queries and capture the results
    results := []bson.M{}
    err1 := pipe.One(&results)
    
    if err1 != nil {
        fmt.Printf("ERROR : %s\n", err1.Error())
        return
    }
    
    fmt.Printf("URL : %s, Size: %sn", results[0]["_id"], results[0]["size"])
    

    另外注意下pipe和find使用上的区别,我理解下来,find是根据条件“查询”出一组集合对象,pipe使用一组“操作”来处理集合对象,这些“操作”包括了:匹配($match),分组($group)等。

    go语言中使用mongo还是非常简单的,网上的教程也是非常多的,关键的是对于mongodb本身熟悉和了解。

    大家有问题可以给我留言。

    相关文章

      网友评论

        本文标题:mgo的一些用法

        本文链接:https://www.haomeiwen.com/subject/tqejvxtx.html