如何用golang mgo驱动程序自动增加mongodb的id字段?

时间:2015-10-14 20:52:12

标签: mongodb go mgo

我是mongodb和golang的新手。在我的一个项目中,我想连接mongo和go。我使用mgo.v2驱动程序连接mongo和go。我的问题是: 如何自动递增文档的_id字段,以便每当我尝试执行POST操作时,它应该自动递增文档的_id字段? 我想实现类似于“FindAndModify”功能的东西,但我没有看到这个功能。 这就是我想要尝试的东西。 Auto increment id in mongodb

    type count struct {
        ID  string `bson:"_id"`
        Seq int    `bson:"seq"`
    }

    var doc count

    func get NextSequence(name string) int{
    change := mgo.Change{
            Update:    collection.Update(count{ID: "userid"}, bson.M{"$inc": count{Seq: 1}}),
            ReturnNew: true,
        }

        _, err1 := collection.Find(bson.M{}).Apply(change, &doc)
       return doc.Seq
   }

    func main(){
        fmt.Println(getNextSequence("userid"))
        fmt.Println(getNextSequence("userid"))
        doc2 := msg{ID: getNextSequence("userid"), Name: "Sarah"}
        doc3 := msg{ID: getNextSequence("userid"), Name: "Sarah2"}
    }

我尝试了上面的代码,但是Seq的值似乎没有增加。每次调用函数时它都给我0。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

根据mgo包文档,您可以使用Query.Apply。我自己没有尝试过,但那里给出的例子似乎已经做了你想要实现的目标:

 change := mgo.Change{
         Update: bson.M{"$inc": bson.M{"n": 1}},
         ReturnNew: true,
 }
 info, err = col.Find(M{"_id": id}).Apply(change, &doc)
 fmt.Println(doc.N)

答案 1 :(得分:1)

尝试以下

再声明一个变量名var total_doc int'

然后执行collection.Find(bson.M{}).Count(total_doc)这将返回您在mongodb数据库中拥有的文档总数。

添加doc.Seq = total_doc + 1之后。每当添加新文档时,这将继续递增序列值。

希望这可以帮到你

答案 2 :(得分:1)

可能会迟到,但您也可以使用night-codes/mgo-ai包来管理您的序列。

我个人使用过这个,我创建了一个单独的sequences集合来存储递增的值。我还保留了_id字段,并为id值设置了单独的sequence字段。

来自README.md

    package main

    import (
        "github.com/night-codes/mgo-ai"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
    )

    func main() {
        session, err := mgo.Dial("localhost")
        if err != nil {
            panic(err)
        }

        // connect AutoIncrement to collection "counters"
        ai.Connect(session.DB("example-db").C("counters"))

        // ...

        // use AutoIncrement
        session.DB("example-db").C("users").Insert(bson.M{
            "_id":   ai.Next("users"),
            "login": "test",
            "age":   32,

    }