rethinkdb - 如何导入JSON并指定时间类型JSON中的哪些字段?

标签 rethinkdb

我正在使用这样的命令将数据导入到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 表中所有行中的 datetime 字段替换为 begin_timeend_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/

相关文章:

javascript - 有没有办法防止 RethinkDB 自动生成的 ID 字段中出现连字符?

Rethinkdb - 获取数组的第一项

html - 在 Phoenix Framework 中显示来自 RethinkDB 的表数据

mysql - sails js 实时电子商务和库存应用的推荐数据库

rethinkdb - 如何从 RethinkDB 的嵌入式数组中删除特定项目?

rethinkdb - rethinkdb 何时返回游标

aggregate - RethinkDB - 如何按聚合时间间隔进行分组

c++ - os x 优胜美地上的 gdb 在程序异常时不显示文件名和行号

rethinkdb - Changefeeds 功能在 RethinkDB 内部如何工作?

go - 按字段内容过滤包含字符串