2 回答
TA贡献1802条经验 获得超5个赞
bson.M
是一个地图,所以如果你使用它,你必须写:bson.M{"_id": oid}
. 查看复合文字 go 中缺少的类型和地图文字 go 中缺少的键。
Andbson.D
是一片结构体,所以如果你使用它,你应该写bson.D{{Key:"$set", Value: input}}
. 省略字段名称不是编译器错误,它只是一个 go vet 警告。
现在开始更换。替换必须是文档本身,而不是使用$set
(这不是更新而是替换)。有关参考,请参阅 MongoDBcollection.replaceOne()
和驱动程序的文档Collection.ReplaceOne()
::
替换参数必须是用于替换所选文档的文档。它不能为 nil,也不能包含任何更新运算符(https://docs.mongodb.com/manual/reference/operator/update/)。
所以这样做:
filter := bson.M{"_id": oid} result, err := coll.ReplaceOne(context.TODO(), filter, input, opts)
TA贡献1772条经验 获得超6个赞
这是完整的代码。这将有助于读者理解代码流。
func UpdateFunction(echoCtx echo.Context) (error) {
//Web Section
documentID := echoCtx.Param("id") //Provided in URL
var newObject myStruct
err := echoCtx.Bind(&newObject) // Json with updated values sent by web client mapped to struct
ctx := echoCtx.Request().Context()
//Database Section
database := db.Conn.Database("myDatabase")
collection := database.Collection("myCollection")
existingHexID, err := primitive.ObjectIDFromHex(documentID)
if err != nil {
fmt.Println("ObjectIDFromHex ERROR", err)
} else {
fmt.Println("ObjectIDFromHex:", existingHexID)
}
// Replacing OLD document with new using _id
filter := bson.M{"_id": newDocumentID}
result, err := collection.ReplaceOne(ctx, filter, newObject)
if err != nil {
log.Fatal(err)
}
fmt.Printf(
"insert: %d, updated: %d, deleted: %d /n",
result.MatchedCount,
result.ModifiedCount,
result.UpsertedCount,
)
return echoCtx.JSON(http.StatusOK, result.ModifiedCount)
}
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报