问题内容 我正在学习Go和gin框架。 我构建了一个连接到 mongoDB 集合的简单微服务,一切正常,但是当我使用 post 添加文档时,它添加“id”字段而不是生成关键“_id”字
我正在学习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"`
}
这是文档< /a>:
编组结构时,每个字段都将小写以生成相应 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”字段的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 发布到 MongoDB 时生成的附加“id”字段
本文链接: https://lsjlt.com/news/561222.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0