2014-02-22 68 views
0

创建从Web界面获取的文档时,它不正确地转换整型日期和其他类型。例如在插入文档时MongoDB Ruby驱动程序类型转换

{"_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"} 

任何帮助,高度赞赏。

+0

你说的是来自POST输入参数的字段数据comimg的权利? –

+0

是的,我特别担心ISODate和布尔转换 – ducktyped

回答

0

由于您似乎担心从表单(例如POST)进来的字符串,所以简单的答案是您将它们转换为Ruby。

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

您的mongo驱动程序将正确解释这些信息,并将它们作为相应的BSON类型存储在您的MongoDB集合中。同样的情况恰恰相反,当您读取收集数据时,您会将其重新转换为您的本机类型。

"1234".to_i 

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

但是这是基本的Ruby部分。

现在你可以像你伪建议和存储您的信息,而不是原生类型,但作为strings某种形式的类型标注。但是你看,我只是不明白这一点,你将不得不

  1. 在某个阶段检测的类型和应用标签

  2. 现场的事实,你只是毁了所有的好处在集合中拥有本地类型。如日期范围的查询和聚合以及值的基本求和。

虽然我们似乎下降了什么类型的赛道,用户只需随意插入数据和其他东西已经制定出它是什么类型,考虑MongoDB的文件下面的例子:

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

所以在蒙戈术语中,文件结构被认为。尽管Mongo确实有一个灵活的模式概念,但这种类型的混合将打破的东西。所以,不这样做,而是作如下处理方式,这是完全可以接受的,即使该架构的不同:

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

长话短说,您的应用程序应该知道类型的的数据。如果您允许user defined forms,然后您的应用程序需要能够将类型附加到它们。如果你有一个字段可能是字符串或日期,然后您的应用程序需要确定它是什么类型,并投它,或以其他方式正确保存。

既然这样,你将重新考虑你使用的情况下,而不是等待别的工作了这一切,为你受益。

+0

但是有个问题,那个文档是从最终用户动态插入的,所以我们不能预/自动判断,哪个字段是什么类型的? – ducktyped

+0

什么用户?你的应用程序的用户?你不能**处理输入和转换类型吗? –

+0

所以,如果你所说的是,“我有一个**任何**字段,可以有各种类型的数据”。 1.糟糕的做法2.您可以检查看看它“看起来像什么”,但这会导致您在Mongo Store中混合类型;所以(见点1) –

相关问题