我正在學習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"` }
這是文件:
編組結構時,每個欄位都會小寫以產生對應 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中文網其他相關文章!