gpt4 book ai didi

mongodb - 将UpdateOne与MongoDB Golang驱动程序一起使用时Upsert无法正常工作

转载 作者:行者123 更新时间:2023-12-04 04:43:47 25 4
gpt4 key购买 nike

供引用,我有这个结构:

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"`
}

我收到一个API响应,其中包含多个要保存在MongoDB中的JSON实例,因此我使用了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的映射不正确?

任何帮助表示赞赏。

最佳答案

您正在调用更新,而不是upsert。您必须将正确的选项传递给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

关于mongodb - 将UpdateOne与MongoDB Golang驱动程序一起使用时Upsert无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59311020/

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