我正在学习go和gin框架。 我构建了一个连接到 mongodb 集合的简单微服务,一切正常,但是当我使用 post 添加文档时,它添加“id”字段而不是生成关键“_id”字段,有没有办法避免这种情况?
这是我的功能:
func (r *rest) createpost(c *gin.context) { var postcollection = database.getcollection(r.db, "godb") ctx, cancel := context.withtimeout(context.background(), 10*time.second) post := new(model.post) defer cancel() if err := c.shouldbindjson(&post); err != nil { c.json(http.statusbadrequest, gin.h{"message": err}) log.fatal(err) return } // validation if err := post.validate(); err == nil { c.json(http.statusok, gin.h{"input": "valid"}) } else { c.json(http.statusbadrequest, gin.h{"input validation": err.error()}) return } postpayload := model.post{ id: primitive.newobjectid(), title: post.title, article: post.article, } result, err := postcollection.insertone(ctx, postpayload) if err != nil { c.json(http.statusinternalservererror, gin.h{"message": err}) return } c.json(http.statusok, gin.h{"message": "posted succesfully", "data": map[string]interface{}{"data": result}}) }
这是我的模型:
type Post struct { ID primitive.ObjectID Title string `validate:"required,gte=2,lte=20"` Article string `validate:"required,gte=4,lte=40"` }
默认情况下,id
的密钥是 id
。您应该使用 bson
标签来生成密钥 _id
。
type post struct { id primitive.objectid `bson:"_id"` title string `validate:"required,gte=2,lte=20"` article string `validate:"required,gte=4,lte=40"` }
这是文档< /a>:
编组结构时,每个字段都将小写以生成相应 bson 元素的密钥。例如,名为“foo”的结构体字段将生成键“foo”。这可以通过结构标记覆盖(例如 bson:"foofield"
来生成键“foofield”)。
当文档不包含名为 _id
的元素时,驱动程序将自动添加一个元素(请参阅源代码):
// ensureid inserts the given objectid as an element named "_id" at the // beginning of the given bson document if there is not an "_id" already. if // there is already an element named "_id", the document is not modified. it // returns the resulting document and the decoded go value of the "_id" element. func ensureid( doc bsoncore.document, oid primitive.objectid, bsonopts *options.bsonoptions, reg *bsoncodec.registry, ) (bsoncore.document, interface{}, error) {
这是一个演示:
package main import ( "context" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type post struct { id primitive.objectid `bson:"_id"` title string `validate:"required,gte=2,lte=20"` article string `validate:"required,gte=4,lte=40"` } func main() { client, err := mongo.connect(context.background(), options.client().applyuri("mongodb://localhost")) if err != nil { panic(err) } postcollection := client.database("demo").collection("posts") post := post{ id: primitive.newobjectid(), title: "test title", article: "test content", } if err != nil { panic(err) } if _, err = postcollection.insertone(context.background(), post); err != nil { panic(err) } }
以及在数据库中创建的文档:
demo> db.posts.find() [ { _id: ObjectId("64a53bcbb7be31ae42e6c00c"), title: 'test title', article: 'test content' } ]
以上是发布到 MongoDB 时生成的附加'id”字段的详细内容。更多信息请关注PHP中文网其他相关文章!