2013-09-11 6 views
1

Я сохраняю временную метку UTC для каждого документа в одной из баз данных Couch. Я хочу запросить и отфильтровать эти документы на основе определенного месяца в году. Для этого я создал представление с помощью следующей функции карты:CouchDB-фильтрация UTC по месяцам и годам

function(doc) { 
    var date = new Date(doc.activity.date); 
    emit([doc.user, date.getUTCMonth(), date.getUTCFullYear()], doc.activity.distance); 
} 

я запрашиваю этот вид с, например: ключ = [ «1edd367d08770ea34586dbe6dc03ea2c», 3,2013], который отлично работает до тех пор, как? UTC и местное время в том же месяце.

Что я спрашиваю, как я могу гарантировать, что такой запрос возвращает все документы месяца, где месяц определяется локальным временем клиента, а не UTC?

Клиент является веб-клиентом на основе JavaScript, но запрос обрабатывается через NodeJS API на задней панели.

+0

Можете ли вы привести пример того, что клиент отправит? –

+0

Нет, извините, но я только начал с представления CouchDB для этой функции, и в зависимости от моих параметров клиент отправит то, что когда-либо понадобится. Например, месяц и год как целые числа и идентификатор пользователя (что здесь не важно) и, возможно, смещение часовых поясов при необходимости. –

+0

Как я уже сказал, существует стандарт ISO 8601, который может быть полезен! –

ответ

2

То, что я спрашиваю, как я могу убедиться, что запрос, как это возвращает все документы в месяц, где месяц определяется клиентами по местному времени, а не UTC?

Найти начало месяца клиента и начало следующего месяца клиента. Они образуют диапазон запроса. Например:

var now = new Date(); 
var start = new Date(now.getFullYear(), now.getMonth(), 1); 
var end = new Date(now.getFullYear(), now.getMonth() + 1, 1); 

Тогда вам нужно будет решить, как наилучшим образом получить это как UTC для перехода к базе данных.Например:

var startUTC = start.toISOString(); 
var endUTC = end.toISOString(); 

(я не уверен, специфики для CouchDB, так что при необходимости отрегулировать.)

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

Я не знаком с синтаксисом кушетки, но в SQL было бы что-то вроде этого:

... WHERE activityDate >= startUTC AND activityDate < endUTC 

Поскольку мы прошли начало следующего месяца как дата окончания, убедитесь, что выполнить исключая <, а не включенную операцию <=. Только дата начала должна быть включена.

+0

Спасибо! То точно, что я придумал с собой минуту назад и хотел опубликовать. Для тех, кого интересует запрос _rage query_ для CouchDB, выглядит примерно так: _? Startkey = ["1edd367d08770ea34586dbe6dc03ea2c", 1370037600000] & endkey = ["1edd367d08770ea34586dbe6dc03ea2c", 1372629599999] _ где * 1370037600000 * и * 1372629599999 * определяют диапазон. –

+0

Я искал запрос диапазона для кушетки, но не смог найти, как сделать * исключительную * дату окончания. Если он полностью включен, убедитесь, что вы вычитаете его перед его прохождением. –

+1

Существует параметр для концевых ключей _exclusive_, называемый inclusive_end. Для получения дополнительной информации: http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options –

0

То, что я спрашиваю, как я могу убедиться, что запрос, как это возвращает всех документы в месяце, где месяц определяются клиентами по местному времени, а не UTC?

Если клиент отправляет его по местному времени, он должен делать это с упоминанием, какой часовой пояс он находится в. В противном случае, он должен использовать UTC или GMT.

Без учета часового пояса вы должны были бы определить, в какой временной зоне находится клиент, и делать предположения, которые не сработают (например, ноутбук, расположенный на итальянском IP, может быть установлен с американским временем).

См: http://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators

Формат ISO 8601 зональное обозначение времени, что позволит клиентам отправлять их МестноеВремя, но с присоединенным смещением по времени.

CouchDB поддерживает этот ISO 8601 формат:

Оставшееся время для совершения конверсий/сравнений и т. Д. Для UTC/Unix time/etc ... любой формат работает для вас, чтобы иметь возможность сравнивать KEY с DATA.

Главное, что вы сравниваете даты, которые преобразуются в одно и то же время или UTC (без смещения по времени).

Смежные вопросы