Home > Backend Development > Golang > Additional 'id' field generated when publishing to MongoDB

Additional 'id' field generated when publishing to MongoDB

王林
Release: 2024-02-05 23:21:07
forward
754 people have browsed it

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

Question content

I am learning the go and gin framework. I built a simple microservice that connects to a mongodb collection and everything works fine, but when I add a document using post it adds the "id" field instead of generating the key "_id" field, is there a way to avoid this?

This is my function:

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}})
}
Copy after login

This is my model:

type Post struct {
ID      primitive.ObjectID
Title   string `validate:"required,gte=2,lte=20"`
Article string `validate:"required,gte=4,lte=40"`
}
Copy after login

Correct answer


By default, the key for id is id. You should use the bson tag to generate the key _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"`
}
Copy after login

This is Documentation< /a>:

When marshaling a structure, each field will be lowercase to generate the key for the corresponding bson element. For example, a structure field named "foo" will generate the key "foo". This can be overridden via structure tags (e.g. bson:"foofield" to generate the key "foofield").

When the document does not contain an element named _id, the driver will automatically add an element (see Source code):

// 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) {
Copy after login

This is a 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)
    }
}
Copy after login

And the document created in the database:

demo> db.posts.find()
[
  {
    _id: ObjectId("64a53bcbb7be31ae42e6c00c"),
    title: 'test title',
    article: 'test content'
  }
]
Copy after login

The above is the detailed content of Additional 'id' field generated when publishing to MongoDB. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template