【发布时间】:2020-02-15 08:59:26
【问题描述】:
当我尝试将我的集合中的字符串类型的属性解码为我的结构中的 int 类型的属性时,我在使用 Go 的 mongodb 驱动程序时遇到了一些问题。我有一个集合,该集合的属性应该是 int 类型,该属性被编辑单个文档的人转换为 string 类型。由于所有文档都具有该属性作为 int 除了那个,我收到错误“无法将字符串解码为整数类型”。我想出了一种方法来做到这一点,但这不是“应该”做的事情。我在 Go 的 mongodb 驱动程序中修改了 default_value_decoders.go 中的 IntDecodeValue 函数。以下是我添加的内容。
case bsontype.String:
s, err := vr.ReadString()
if err != nil {
return err
}
i32, err := strconv.Atoi(s)
if err != nil {
return err
}
i64 = int64(i32)
我知道当我更新驱动程序时这将被覆盖,但我一直在努力想弄清楚如何处理这种情况。我知道最好的解决方案是不允许直接编辑文档,但要考虑这种情况。
【问题讨论】:
-
唯一可行的解决方案是删除任何愚蠢到手动编辑数据库中文档的人的访问权限。您无法解释用户在手动修改数据时可以使用多少种方式来破坏数据。如果他们稍后将字符串更改为 int 怎么办?还是一个数组到一个字符串?您不能只是不断地向 Mongo 驱动程序添加 hack 来解释那些显然不应该首先拥有 DB 访问权限的人的不当行为。
-
我完全同意这个评估。我只是希望有一种方法可以扩展该功能,以便能够优雅地处理所述重整,而不会导致应用程序出现问题或排除已被重整的文档。
-
是的,有点。您需要为他们可能会破坏您希望能够优雅处理的数据的每一种方式添加另一个 hack。这些会堆积起来,使更新安全补丁变得更加困难。也就是说......你的问题实际上并没有问题。你的问题到底是什么?
-
有没有办法扩展该功能,所以我可以添加至少一些它可能会被破坏的方式。我只学了几个星期,而且 afaik 没有像其他语言那样的扩展功能。
-
我决定这可能不是我想像阿德里安所说的那样走下去的道路,太多的可能会被破坏。我将在创建集合时设置一些验证规则,这样如果有人手动编辑文档,他们就不能违反集合上的数据类型