MongoDB Ruby驱动程序在插入文档时进行类型转换

时间:2014-02-22 07:35:36

标签: ruby mongodb

在创建从Web界面获取的文档时,它并没有正确地对整数日期和其他类型进行类型转换。例如

{"_id": "<some_object_id>", "name": "hello", "age": "20", "dob": "1994-02-22"}

由于动态输入属性,因此无法预先判断其类型。我有什么方法可以从客户端输入它们,比如

{"_id": "<some_object_id>", "name": "hello", "age": "$int:20", "dob": "$date:1994-02-22"}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

由于您似乎关注来自表单(例如POST)的字符串,因此简单的答案是您将它们转换为Ruby。

如果该字段是您期望的数字,则将其转换为int。日期也是如此。

您的mongo驱动程序将正确解释这些并将它们存储为MongoDB集合中相应的BSON类型。反之亦然,当您阅读收集数据时,您将把它重新投射到您的原生类型中。

"1234".to_i

 Date.strptime("{ 2014, 2, 22 }", "{ %Y, %m, %d }")

但那是Ruby的基本部分。

现在您可以执行类似伪建议的操作并存储您的信息,而不是本机类型,而是strings带有某种形式的类型标记。但是,看,我只是没有看到你需要的观点

  1. 在某个阶段检测类型并应用标记

  2. 实际上你破坏了在集合中使用本机类型的所有好处。例如日期范围的查询和聚合以及值的基本求和。

  3. 虽然我们似乎正在走向任何类型的轨道,用户只是随意插入数据而其他东西必须确定它是什么类型,请考虑以下MongoDB文档示例:

    {
      name: "Fred",
      values: [ 1, 2, 3, 4],
    }
    {
      name: "Sally",
      values: "a"
    }
    

    因此,在Mongo术语中,该文档结构被视为错误。尽管Mongo确实具有灵活的架构概念,但这种混合会破坏事物。所以不要这样做,而是以下面的方式处理,即使模式不同,这是完全可以接受的:

    {
      name: "Fred",
      values: [ 1, 2, 3, 4],
    }
    {
      name: "Sally",
      mystring: "a"
    }
    

    长话短说,您的应用应该知道正在进入的类型数据。如果您允许user defined forms,那么应用需要能够为其附加类型。如果您有可能字符串或日期的字段,那么您的应用需要确定它是哪种类型,然后将其投射或正确存储。< / p>

    目前,您将从重新考虑使用案例中受益,而不是等待其他事情为您完成所有工作。