【问题标题】:How to auto-increment id field of mongodb with golang mgo driver?如何使用 golang mgo 驱动程序自动增加 mongodb 的 id 字段?
【发布时间】:2016-01-13 03:13:40
【问题描述】:

我是 mongodb 和 golang 的新手。在我的一个项目中,我想将 mongo 与 go 连接起来。我正在使用 mgo.v2 驱动程序将 mongo 与 go 连接起来。我的问题是: 如何自动增加文档的 _id 字段,以便每当我尝试执行 POST 操作时,它应该自动增加文档的 _id 字段? 我想实现类似于“FindAndModify”功能的东西,但我在 go 中看不到这个功能。 这就是我想尝试的。 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。 感谢您的帮助。

【问题讨论】:

  • MongoDB 中的自动递增往往是一种不好的做法,因为它不能很好地扩展。这有点违背了使用它的目的。默认不是自动递增的主键值是有原因的。您有什么想法想要实现,只能通过自动递增 id 来实现?
  • 我完全同意@WillC。此外:_id 是不可变的。当您“更改”它时,您实际上是创建了一个新文档。如果您确实需要计数器(例如用于乐观锁定),您应该在 not _id 的字段上使用 $inc 运算符。

标签: mongodb go mgo


【解决方案1】:

根据 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)

【讨论】:

  • 我尝试了同样的事情,但该字段似乎没有增加。
  • 帮了我很多忙!谢谢!
【解决方案2】:

试试下面这个

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

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

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

希望对你有帮助

【讨论】:

  • 如果 2 个并发 goroutine 查询总计数并尝试插入新文档,这不会提供安全性,它们将使用相同的 ID。
【解决方案3】:

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

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

来自其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,

    }

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2020-07-19
    • 2019-05-27
    • 2018-12-06
    • 2015-06-15
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多