gpt4 book ai didi

mongodb - 在 Go 中使用 MongoDb 默认驱动程序创建唯一索引

转载 作者:行者123 更新时间:2023-12-03 15:59:15 24 4
gpt4 key购买 nike

我在使用official MongoDB driver for Go为我的一些数据创建唯一索引时遇到一些问题。 .

所以我有一个像这样的结构:

type Product struct {
ID primitive.ObjectID `json:"_id" bson:"_id"`
Name string `json:"name" bson:"name"`
Price float64 `json:"price" bson:"price"`
Attribute []Attribute `json:"attribute" bson:"attribute"`
Category string `json:"category" bson:"category"`
}

然后我想为 name 属性创建一个唯一索引。我尝试在我的 Create 函数(针对产品)

中执行类似的操作
func Create(c echo.Context) error {

//unique index here
indexModel, err := productCollection.Indexes().CreateOne(context.Background(),
IndexModel{
Keys: bsonx.Doc{{"name", bsonx.Int32(1)}},
Options: options.Index().SetUnique(true),
})
if err != nil {
log.Fatalf("something went wrong: %+v", err)
}

//create the product here
p := new(Product)
if err := c.Bind(p); err != nil {
log.Fatalf("Could not bind request to struct: %+v", err)
return util.SendError(c, "500", "something went wrong", "failed")
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, _ := productCollection.InsertOne(ctx, p)

return util.SendSuccess(c, result.InsertedID)

}

问题是我不完全知道如何在创建产品之前将 indexModel 作为上下文中的选项传递。另外,我不确定我正在做的事情是否只是创建索引一次(这就是我想要做的)。如果我能指出如何做到这一点的正确方向,我将不胜感激。

我正在使用 Go 的 echo 框架,以防万一这提供了更多上下文。

最佳答案

您的代码将在每次调用Create函数时尝试创建索引,这可以工作,但效率不高,因为索引只需要创建一次(或者如果不创建索引)不存在)。我建议让索引的创建由设置数据库连接的函数负责,或者由初始化数据库连接后立即运行的函数负责,这样它只运行一次(当您的程序启动时)。

由于 collection.Indexes().CreateOne(...) 方法在尝试创建已存在的索引时不会返回错误,因此您可以使用它来确保索引存在,类似于非官方 MongoDB 驱动程序的 EnsureIndex功能。

或者,您可以按照 Cahaba Data 在 his answer 中的建议进行操作,这将使索引创建成为一项一次性的数据库管理任务,而不是应用程序的责任。我之前曾与一些同事就此进行过讨论,虽然我确实同意这在技术上是一项一次性数据库管理任务,但我仍然更喜欢让我的应用程序在启动时确保它所需的索引实际上在那里,创建如果他们不是的话。毕竟,如果有人忘记或创建了错误的索引,我的应用程序可能会出现故障/瘫痪。它还提供了关于您的应用程序需要/使用哪些索引的良好文档,而不必与数据库管理员进行沟通并希望他/她/它会正确记录它。当然,请随意形成您自己的意见:)

关于mongodb - 在 Go 中使用 MongoDb 默认驱动程序创建唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60469549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com