J'apprends le framework go and gin. J'ai construit un microservice simple qui se connecte à une collection mongodb et tout fonctionne bien, mais lorsque j'ajoute un document en utilisant post, il ajoute le champ "id" au lieu de générer le champ clé "_id", existe-t-il un moyen d'éviter cela ?
Voici ma fonction :
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}}) }
Voici mon modèle :
type Post struct { ID primitive.ObjectID Title string `validate:"required,gte=2,lte=20"` Article string `validate:"required,gte=4,lte=40"` }
Par défaut, 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"` }
Voici la documentation< /a> :
Lors du rassemblement d'une structure, chaque champ sera en minuscules pour générer la clé de l'élément bson correspondant. Par exemple, un champ de structure nommé « foo » générera la clé « foo ». Cela peut être remplacé via des balises de structure (par exemple bson:"foofield"
pour générer la clé "foofield").
Lorsque le document ne contient pas d'élément nommé _id
, le pilote ajoutera automatiquement un élément (voir code source) :
// 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) {
Voici une démo :
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) } }
Et le document créé dans la base de données :
demo> db.posts.find() [ { _id: ObjectId("64a53bcbb7be31ae42e6c00c"), title: 'test title', article: 'test content' } ]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!