作为参考,我有这个结构: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.
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报
0/150
提交
取消