Как я могу сделать карты с использованием строковых полей в rethinkdb?

Я хочу изменить временные метки всего в моей таблице. Кажется, я должен быть в состоянии использовать for_each но я не уверен как.

Основываясь на документации, я думаю, что моя функция должна возвращать объект записи. Но у меня проблемы с выполнением вещей, связанных со строками. Вот очень простой пример:

r.expr([{'time':"2014"}]).map(lambda x: datetime.strptime(x['time'],'%Y'))

Это дает мне ошибку:

TypeError: must be string, not GetField

Интересно, что следующие работы:

map(lambda x: datetime.strptime(x,'%Y'), 
    r.expr([{'time':"2014"}])
     .map(lambda x: x['time'])
     .run(conn))

Что я делаю неправильно?

1 ответ

Решение

datetime.strptime это метод python, а не метод ReQL, поэтому вы не можете отправить его на сервер.

Когда вы звоните run по вашему запросу драйвер сохранит вывод лямбда-функции при вызове с объектом ReQL. Когда он ударит datetime.strptime(x['time'],'%Y')) вы получите ошибку, потому что вы звоните datetime.strptime с недопустимым аргументом.

Если вам интересно узнать немного больше, вы можете взглянуть на: http://www.rethinkdb.com/blog/lambda-functions/

Вы, вероятно, хотите сохранить год как число. Таким образом, запрос, который вы ищете, я думаю,

r.expr([{'time':2014}]).map(lambda x: r.time(x['time'], 1, 1, '+00:00')

Если вы хотите сохранить строку, вы можете сделать

r.expr([{'time':2014}]).map(lambda x: r.time(x['time'].coerce_to("NUMBER"), 1, 1, '+00:00')
Другие вопросы по тегам