Heim > Backend-Entwicklung > Golang > Zusätzliches „id'-Feld, das beim Veröffentlichen in MongoDB generiert wird

Zusätzliches „id'-Feld, das beim Veröffentlichen in MongoDB generiert wird

王林
Freigeben: 2024-02-05 23:21:07
nach vorne
754 Leute haben es durchsucht

发布到 MongoDB 时生成的附加“id”字段

Frageninhalt

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}})
}
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

Richtige Antwort


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"`
}
Nach dem Login kopieren

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) {
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

Und das in der Datenbank erstellte Dokument:

demo> db.posts.find()
[
  {
    _id: ObjectId("64a53bcbb7be31ae42e6c00c"),
    title: 'test title',
    article: 'test content'
  }
]
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage