在MongoDB中使用shortid作为自定义Object ID遇到的问题
解决MongoDB中自定义shortid作为_id被自动替换的问题
这个需求完全可行,MongoDB本身支持用任意类型(只要集合内唯一)作为_id字段值,你的问题出在Go结构体的字段定义上:
- Go语言中,小写开头的字段是私有字段,MongoDB的Go驱动无法识别并序列化这个字段,所以插入文档时会直接忽略你设置的
_id值,自动生成默认的ObjectId。
修正方案
把结构体里的_id改成大写开头的字段,同时通过bson标签映射到MongoDB的_id字段:
type Book struct { ID string `bson:"_id"` Title string Author string ISBN string Publisher string Copies int } // ... id := shortid.MustGenerate() book1 := Book{ ID: id, Title: "Animal Farm", Author: "George Orwell", ISBN: "0451526341", Publisher: "Signet Classics", Copies: 100, } insertResult, err := booksCollection.InsertOne(context.TODO(), book1)
额外注意事项
- 要保证你生成的shortid在目标集合内是唯一的,否则插入时会触发重复键错误(MongoDB对
_id字段默认强制唯一约束) - 如果后续需要查询这个文档,直接用你设置的shortid值匹配
_id字段即可,和默认ObjectId的查询逻辑一致
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

