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

插入文档时MongoDB Ruby驱动程序类型转换,ruby,mongodb,Ruby,Mongodb,当创建从web界面获取的文档时,它不能正确地键入整型日期和其他类型。比如说 {"_id": "<some_object_id>", "name": "hello", "age": "20", "dob": "1994-02-22"} {u id:”“name:”“hello”,“age:”“20”,“dob:”“1994-02-22”} 由于属性是动态输入的,因此不能预先判断其类型。有没有办法让他们从客户端输入,比如 {"_id": "<some_object_id>

当创建从web界面获取的文档时,它不能正确地键入整型日期和其他类型。比如说

{"_id": "<some_object_id>", "name": "hello", "age": "20", "dob": "1994-02-22"}
{u id:”“name:”“hello”,“age:”“20”,“dob:”“1994-02-22”}
由于属性是动态输入的,因此不能预先判断其类型。有没有办法让他们从客户端输入,比如

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

非常感谢您提供的任何帮助。

因为您似乎关心来自POST等表单的字符串,简单的答案是您可以将它们转换为Ruby

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

mongo驱动程序将正确解释这些类型,并将它们存储为MongoDB集合中相应的BSON类型。反之亦然,当您读取集合数据时,您会将其重新转换为本机类型

"1234".to_i

 Date.strptime("{ 2014, 2, 22 }", "{ %Y, %m, %d }")
但这是基本的Ruby部分

现在,您可以像伪建议的那样执行操作,并将信息存储为
字符串,而不是本地类型,并带有某种类型标记。但是你看,我只是不明白你的意思

  • 在某个阶段检测类型并应用标签

  • 接受这样一个事实:您刚刚破坏了在集合中使用本机类型的所有好处。例如查询和聚合日期范围和基本值求和

  • 而当我们似乎正在沿着<强> > < <强> >类型时,用户随意插入数据和<强> >其他< <强> >必须计算出它是什么类型,请考虑下面的MangGDB文档示例:

    {
      name: "Fred",
      values: [ 1, 2, 3, 4],
    }
    {
      name: "Sally",
      values: "a"
    }
    
    因此,在Mongo术语中,该文档结构被认为是坏的。尽管Mongo确实有一个灵活的模式概念,但这种类型的混合将破坏一切。因此,不要这样做,而是按以下方式处理,这是可以接受的,即使模式不同:

    {
      name: "Fred",
      values: [ 1, 2, 3, 4],
    }
    {
      name: "Sally",
      mystring: "a"
    }
    
    长话短说,您的应用程序应该知道传入的数据类型。如果您允许
    用户定义表单
    ,则您的应用程序需要能够将类型附加到表单上。如果您有一个字段可以是字符串或日期,那么您的应用程序需要确定它是哪种类型,并强制转换它,或者以其他方式正确存储它


    目前,您将受益于重新考虑您的用例,而不是等待其他东西为您解决所有问题。

    您所说的字段数据来自输入后参数,对吗?是的,我特别担心ISODate和布尔转换,但有一个问题,文档是从最终用户动态插入的,所以我们不能预先/自动判断,哪个字段是什么类型的?哪个用户?您的应用程序的用户?你不能处理输入和转换类型吗?如果你说的是,“我有一个可以包含各种类型数据的anywhere字段”。1.坏习惯2。你可以查看它的“外观”,但这将导致混合类型在你的Mongo商店;因此(见第1点),我认为较长的答题表应该澄清这一点。这里真正要做的是鼓励你改变你的想法,使之远离你最初试图遇到的情况。