基于documentation , go.mongodb.org/mongo-driver
似乎没有提供一种在更新未提供 ID 的文档时自动递增 ID 的方法。
type Document struct {
ID int `bson:"_id"`
Foo string `bson:"foo"`
}
document := &Document{Foo: "test"}
filter := bson.M{"_id": bson.M{"$eq": document.ID}}
update := bson.M{"$set": document}
res, err := mongoClient.Database(dbName).
Collection(collectionName).
UpdateOne(ctx, filter, update,
options.Update().SetUpsert(true))
在上面的代码示例中,ID会默认为int的零值,即0
,在MongoDB中持久化为{"_id":0,"foo “:”测试“
。
当没有使用 mongo-driver
提供 ID 时,是否有一种干净的方法来自动递增 ID,而无需自己执行跟踪最后一个 ID 的逻辑?假设数据库中已经有 5 个文档,然后运行上面的代码将在未提供 ID 时保留 {"_id":6,"foo":"test"}
。
最佳答案
我发现了同样的问题,我认为的解决方案是定义没有 ID 的 Document 结构:
type Document struct {
Foo string `bson:"foo"`
}
然后,如果使用 mongo-driver 执行 InsertOne 操作:
res, err := mongoClient.Database(dbName).Collection(collectionName).InsertOne(ctx, document)
_id 将在数据库中自动创建(您可以多次重复InsertOne 操作,新的_id 将出现)。
mongodb 文档解释了这种行为:“如果文档未指定 _id 字段,则 mongod 将添加 _id 字段并在插入之前为文档分配一个唯一的 ObjectId。”(您可以在 https://docs.mongodb.com/manual/reference/method/db.collection.insertOne/#db.collection.insertOne 中阅读更多详细信息)
如果您出于某种原因需要新创建的 _id,您可以使用以下代码段作为引用来检索它:
fmt.Println("New Document created with mongodb _id: " + res.InsertedID.(primitive.ObjectID).Hex())
(primitive.ObjectID与此相关:import "go.mongodb.org/mongo-driver/bson/primitive")
希望这对您有所帮助!
关于使用 Golang mongo-driver 的 MongoDB 自动增量 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61078884/