我正在使用这样的命令将数据导入到RethinkDB
rethinkdb import --force -f ${folder}/json/data.json --table test.data -c localhost:28015
它完美地导入数据。但我的 json 中有一些字段作为时间:
{
"id": "1",
"date": "2015-09-19",
"time": {
"begin": "09:00",
"end": "10:30"
}
}
当我尝试查询这些字段(例如 data 或 time.begin、time.end)时,它们将它们视为时间 - RethinkDB 无法理解它并抛出异常
r.db('test').table('data').filter(function(t) {
return t("date").date()
})
RqlRuntimeError: Not a TIME pseudotype: `"2015-09-19"` in:
r.db("test").table("data").filter(function(var_43) { return var_43("date").date(); })
^^^^^^^^^^^^^^
有什么方法可以为 RethinkDB 指定 JSON 中的哪些字段为时间类型?
最佳答案
JSON 不提供指定时间字段的标准方法,但您可以通过多种方法使用 RethinkDB 来执行此操作:在插入数据之前或之后修改数据。 RethinkDB 时间对象不仅仅是您在此处显示的字符串,还包含毫秒时间分辨率以及时区数据。
时间对象可以使用 r.now()
、r.time()
、r.epoch_time()
和 r.ISO8601()
。由于时间字符串的格式,我会使用 r.ISO8601()
。请务必注意,您的数据似乎不包含时区信息,因此您应该确保您的数据如果全部放入同一时区,则不会返回错误的结果。
在 RethinkDB 中使用时间时要记住的另一件事是,数据将在客户端中转换为适当的时间对象。由于您似乎正在使用 Javascript,因此您将返回一个 Date
对象。对于 Python,您将获得一个 datetime.datetime
对象等。如果您希望获得原始时间伪类型格式(见下文),您可以指定 timeFormat: "raw"
作为查询的全局 optarg(有关详细信息,请参阅 run()
的文档)。
在 RethinkDB 中对数据进行后处理
这可能是最简单的选择,也是我推荐的。导入数据后,您可以运行查询来修改每一行,以将字符串转换为时间对象。根据您的数据格式,这应该有效:
r.db('test').table('data').replace(function(row) {
return row.merge({
'begin_time': r.ISO8601(row('date').add('T').add(row('time')('begin')), { defaultTimezone: '+00:00' }),
'end_time': r.ISO8601(row('date').add('T').add(row('time')('end')), { defaultTimezone: '+00:00' })
}).without('date', 'time');
}).run(conn, callback)
这会将 test.data
表中所有行中的 date
和 time
字段替换为 begin_time
和 end_time
时间对象,可以按您的预期使用。 defaultTimezone
字段是必需的,因为时间字符串不包含时区信息,但您应该将这些值更改为适当的值。
修改JSON数据
这有点低级,可能会很棘手,但如果您不介意亲自动手,这可能更适合您的需求。
RethinkDB 时间对象使用特定格式以 JSON 形式表示“伪类型”。这些类型未在 JSON 中标准化,但仍然存在于 RethinkDB 中。时间伪类型的格式如下所示:
{
"$reql_type$": "TIME",
"epoch_time": 1413843783.195,
"timezone": "+00:00"
}
其中 epoch_time
是自 UNIX 纪元(1970 年 1 月 1 日)以来的秒数。如果您要导入的数据遵循此格式,您可以直接插入它,数据库会将其解释为有效的时间对象。您可以自行修改要导入的数据,但示例行将如下所示:
{
"id": "1",
"begin_time": {
"$reql_type$": "TIME",
"epoch_time": 1442653200,
"timezone": "+00:00"
},
"end_time': {
"$reql_type$": "TIME",
"epoch_time": 1442658600,
"timezone": "+00:00"
}
}
我对时区的同样警告也适用于此。
关于rethinkdb - 如何导入JSON并指定时间类型JSON中的哪些字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454119/