为了账号安全,请及时绑定邮箱和手机立即绑定

将 UpdateOne 与 MongoDB Golang 驱动程序一起使用时,更新插入不起作用

将 UpdateOne 与 MongoDB Golang 驱动程序一起使用时,更新插入不起作用

Go
白猪掌柜的 2023-08-14 15:00:29
作为参考,我有这个结构:type OpenOrderCleaned struct {    OrderID             string    `json:"orderId" bson:"orderId"`    DateTimeOrderPlaced time.Time `json:"dateTimeOrderPlaced" bson:"dateTimeOrderPlaced"`    OrderItems          []struct {        OrderItemID   string `json:"orderItemId" bson:"orderItemId"`        Ean           string `json:"ean" bson:"ean"`        CancelRequest bool   `json:"cancelRequest" bson:"cancelRequest"`        Quantity      int    `json:"quantity" bson:"quantity"`    } `json:"orderItems" bson:"orderItems"`}我收到一个包含多个 JSON 实例的 API 响应,我想将这些实例保存在 MongoDB 中,因此我使用了 for 循环。我想通过使用该字段来检查数据库中是否已存在文档,orderId该字段对于每个 JSON 实例都是唯一的。我认为UpdateOne这是一个不错的选择,因为它有upsert. 因此,如果 orderId 不存在,则应生成完整文档并将其存储在数据库中。for _, OpenOrderCleaned := range o.Orders {    c := auth.GetClient()    collection := c.Database("goprac").Collection(x)    filter := bson.M{"orderId": bson.M{"$eq": OpenOrderCleaned.OrderID}}    update := bson.M{        "$set": bson.M{            "orderId":             OpenOrderCleaned.OrderID,            "dateTimeOrderPlaced": OpenOrderCleaned.DateTimeOrderPlaced,            "orderItems":          OpenOrderCleaned.OrderItems,        },    }    ctx, _ := context.WithTimeout(context.Background(), 15*time.Second)    result, err := collection.UpdateOne(ctx, filter, update)    if err != nil {        fmt.Println("UpdateOne() result ERROR:", err)        os.Exit(1)    } else {        fmt.Println("UpdateOne() result:", result)        fmt.Println("UpdateOne() result TYPE:", reflect.TypeOf(result))        fmt.Println("UpdateOne() result MatchedCount:", result.MatchedCount)        fmt.Println("UpdateOne() result ModifiedCount:", result.ModifiedCount)        fmt.Println("UpdateOne() result UpsertedCount:", result.UpsertedCount)        fmt.Println("UpdateOne() result UpsertedID:", result.UpsertedID)    }}但现在Upsert不起作用。当我将手动文档放入 MongoDB 并运行该程序时,它正在更新。那么为什么数据库中没有创建新实例呢?我必须在某处upsert=True或某事上声明吗?或者也许映射"orderItems":          OpenOrderCleaned.OrderItems不正确?任何帮助表示赞赏。
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

您正在调用更新,而不是更新插入。您必须传递正确的选项才能UpdateOne进行更新插入。这是来自 mongo 驱动程序示例:


opts := options.Update().SetUpsert(true)

filter := bson.D{{"_id", id}}

update := bson.D{{"$set", bson.D{{"email", "newemail@example.com"}}}}


result, err := coll.UpdateOne(context.TODO(), filter, update, opts)

您缺少opts.


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信