2017-02-01 2 views
1

Нашел своеобразное поведение, задаваясь вопросом, может ли кто-нибудь помочь мне понять его, чтобы избежать подобных проблем в будущем.Cloudant View Необычное условное поведение с датами

Создание облачного представления Я хочу вернуть только записи с отметкой времени текущего дня.

Мне было трудно заставить его работать, и выяснилось, что разница заключается в наличии пробела перед окончанием условия if.

См ниже для работы и не работает

if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0)){ 

Works, чтобы проверить текущую дату против Cloudant даты дока

if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0)){ 

Не работаю, чтобы проверить дату против Cloudant даты дока

Полный рабочий вид ниже для контекста

function (doc) { 
    if (doc.details.location){ 
    if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0)){ 
     emit(doc.details.location.toLowerCase(), { "location": doc.details.location.toLowerCase(), "status": doc.details.status, "user": doc.details.username, "time": doc.details.timestamp}) 
    } 
    } 
} 

Всего наилучшего,

Scott.

ответ

3

Я подозреваю, что это может быть связано с датой/временем выполнения инструкции if, а не с пространством.

Функция map должна быть детерминированной независимо от времени выполнения.

Это выглядит как вы предполагаете, что функция map работает во время запроса (так new Date излучал бы сегодняшнюю дату). Вместо этого он работает со временем индексирования, поэтому значение new Date - это то, что происходит в момент времени, когда происходит индексация. Поскольку индексирование выполняется в другое время для вставки документа (иногда между вставкой и при запросе представления), использование любой формы значения, которая изменяется со временем, приведет к непредсказуемым результатам.

Я подозреваю, что пространство является сопутствующим, и вместо этого выход new Date меняется и поэтому меняет то, что излучается на ваш взгляд.

Для вашей проблемы - запрос на вещи «сегодня» - я думаю, вы хотите вместо этого испустить такой ключ, как [location, year, month, day]. Ваша функция карта будет выглядеть так:

function (doc) { 
    if (doc.details.location) { 
    var l = doc.details.location.toLowerCase(); 
    var d = Date.parse(doc.details.timestamp); 
    emit([l, d.getFullYear(), d.getMonth(), d.getDate()], { 
     "location": l, 
     "status": doc.details.status, 
     "user": doc.details.username, 
     "time": doc.details.timestamp 
    }); 
    } 
} 

Как JavaScript использует 0 на основе индексов в течение месяца, чтобы запросить по всем пунктам на месте Bristol на сегодня, 2-Feb-2017, вы бы использовать key=["bristol",2017,1,2] в вашей запрос к представлению.

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