Ich lerne das Go- und Gin-Framework. Ich habe einen einfachen Microservice erstellt, der eine Verbindung zu einer MongoDB-Sammlung herstellt, und alles funktioniert einwandfrei. Wenn ich jedoch ein Dokument mit Post hinzufüge, wird das Feld „id“ hinzugefügt, anstatt das Schlüsselfeld „_id“ zu generieren. Gibt es eine Möglichkeit, dies zu vermeiden?
Das ist meine Funktion:
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}}) }
Das ist mein Modell:
type Post struct { ID primitive.ObjectID Title string `validate:"required,gte=2,lte=20"` Article string `validate:"required,gte=4,lte=40"` }
Standardmäßig 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"` }
Das ist die Dokumentation< /a>:
Beim Marshalling einer Struktur wird jedes Feld in Kleinbuchstaben geschrieben, um den Schlüssel für das entsprechende BSON-Element zu generieren. Beispielsweise generiert ein Strukturfeld mit dem Namen „foo“ den Schlüssel „foo“. Dies kann über Struktur-Tags überschrieben werden (z. B. bson:"foofield"
, um den Schlüssel „foofield“ zu generieren).
Wenn das Dokument kein Element mit dem Namen _id
enthält, fügt der Treiber automatisch eines hinzu (siehe Quellcode):
// 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) {
Hier ist eine Demo:
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) } }
Und das in der Datenbank erstellte Dokument:
demo> db.posts.find() [ { _id: ObjectId("64a53bcbb7be31ae42e6c00c"), title: 'test title', article: 'test content' } ]
Das obige ist der detaillierte Inhalt vonZusätzliches „id'-Feld, das beim Veröffentlichen in MongoDB generiert wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!