Golang和MongoDB -我尝试使用golang将切换布尔值更新为mongoDB,但得到了对象

igetnqfo  于 11个月前  发布在  Go
关注(0)|答案(2)|浏览(109)

我曾经使用React和Nodejs实现todo应用程序。React和Nodejs中的toggle函数用于更新Mongodb数据库,如下代码所示:

const toggleChecked = ({ _id, isChecked }) => {
  TasksCollection.update(_id, {
    $set: {
      isChecked: !isChecked
    }
  })
};

字符串
我想在Golang中实现toggle函数来更新boolean字段,但我得到了object,以下是Golang代码:

func updateOneMovie(movieId string) model.Netflix {
    id, _ := primitive.ObjectIDFromHex(movieId)
    filter := bson.M{"_id": id}
    update := bson.M{"$set": bson.M{"watched": bson.M{"$not": "$watched"}}}
    var updateResult model.Netflix

    result, err := collection.UpdateOne(context.Background(), filter, update)

    err = collection.FindOne(context.Background(), filter).Decode(&updateResult)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(result)
    return updateResult
}


Mongodb中的结果更新为对象而不是布尔值。我如何修复以使其更新为布尔值?

t8e9dugd

t8e9dugd1#

传递单个文档(例如bson.Mbson.D)作为更新文档,字段名称和值将按原样(字面意思)解释。
要使用aggregation pipelines with updates,你必须传递一个数组作为更新文档,这就是触发器将其解释为聚合管道的原因。这是唯一的要求。数组可以是mongo.Pipelinebson.A[]bson.D[]bson.M甚至[]any,这无关紧要,它必须是Go中的数组或切片。元素可以是bson.Mbson.D或表示文档的任何其他值。
所以最简单的解决方案是:

filter := bson.M{"_id": id}
update := []any{
    bson.M{"$set": bson.M{"watched": bson.M{"$not": "$watched"}}}
}

字符串

jckbn6z7

jckbn6z72#

我找到了解决方案,我使用管道与bson.D作为以下代码:

func updateOneMovie(movieId string) model.Netflix {
    id, _ := primitive.ObjectIDFromHex(movieId)
    filter := bson.M{"_id": id}
    update := bson.D{{Key: "$set", Value: bson.D{{Key: "watched", Value: bson.D{{Key: "$not", Value: "$watched"}}}}}}
    var updateResult model.Netflix

    result, err := collection.UpdateOne(context.Background(), filter, mongo.Pipeline{update})

    err = collection.FindOne(context.Background(), filter).Decode(&updateResult)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Modified Count: ", result.ModifiedCount)
    return updateResult
}

字符串
结果,我可以正确地更新布尔值。

相关问题