2015-10-14 64 views
2

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

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"} 
    } 

我尝试了上面的代码,但序列的价值似乎并不increment.It给我0每次我做的函数的调用。 感谢您的帮助。

+1

自动增加MongoDB中往往是一个不好的做法,因为它没有很好地扩展。它有点挫败了使用它的目的。有一个原因,为什么默认不是自动递增的主键值。有没有什么你想到的只能通过自动递增ID来实现? –

+0

我完全同意@WillC。此外:'_id'是不可变的。当你“改变”它时,你可以有效地创建一个新文档。如果你确实需要一个计数器(例如用于乐观锁定),则应该在* not *'_id'字段使用'$ inc'运算符。 –

回答

2

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

我试过同样的事情,但该领域似乎并没有增加。 –

+0

帮了我很多!谢谢! – deepakssn

1

尝试下面的一个

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

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

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

希望这可以帮助你

0

可能会晚点,但你也可以使用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, 

    } 
相关问题