我是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。 谢谢你的帮助。
答案 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,
}