YDN-DB - неверные результаты при использовании смешанных типов данных с SortedMerge
Я использую отличную YDN-DB как часть сложной веб-страницы "приборной панели", которая позволяет пользователю загружать большое количество информации, а затем искать и фильтровать данные так, как они хотят.
Данные поступают в виде 1 UNID и 6 столбцов видимых данных, которые я храню с использованием схемы YDN, например:
var schema = {
stores: [
{
name: 'test', keyPath: 'unid', autoIncrement: false,
indexes: [
{keyPath: 'a', type: 'TEXT'},
{keyPath: 'b', type: 'TEXT'},
{keyPath: 'c', type: 'TEXT'},
{keyPath: 'd', type: 'DATE'},
{keyPath: 'e', type: 'TEXT'},
{keyPath: 'f', type: 'TEXT'}
]
}
]
};
Затем пользователь может поместить фильтр в любой из шести столбцов выше. Код для создания фильтров выглядит следующим образом и использует YDN KeyRange для фильтрации данных по значениям, запрошенным пользователем.
var filterArr = []
var resultArr = [];
filterArr.push(new ydn.db.IndexIterator('test', 'a', ydn.db.KeyRange.only('search value 1')));
filterArr.push(new ydn.db.IndexIterator('test', 'b', ydn.db.KeyRange.only('search value 2')));
.. [Continue adding filters for more columns if necessary etc] ..
var req = db.scan(new ydn.db.algo.SortedMerge(resultArr), filterArr);
req.then(function() {
db.values('test', resultArr).done(function(results) {
.. [Display code goes here] ..
})
})
Так что для согласованных значений это работает нормально. Моя проблема, однако, заключается в том, что пользователь может указать диапазон дат для столбца D, поэтому я изменил одну из строк filterArr, как показано ниже:
filterArr.push(new ydn.db.IndexIterator('test', 'd', ydn.db.KeyRange.bound(1389571200000, 1390435200000, false, false)));
Это приводит к неверным результатам поиска. Похоже, это происходит только тогда, когда указано несколько значений filterArr. Если я отфильтрую столбец D сам по себе, он, кажется, работает.
Извините за сложный запрос и очень надеюсь на какой-то ответ. Я потратил некоторое время на отладку SortedMerge JS, и мои ограниченные знания позволяют предположить, что что-то не так с результатом каждого вызова функции ydn.db.cmp, поэтому я подумал, была ли это ошибка в БД YDN?
2 ответа
Из того, что я вижу из вашего кода, столбец "d" должен быть INTEGER, или запрос должен использовать дату, например:
ydn.db.KeyRange.bound(toDate(1389571200000),toDate(1390435200000), false, false)
РЕДАКТИРОВАТЬ:
Извините, алгоритм соединения ключей работает только для равного соединения. Диапазон не будет работать. Однако вы можете использовать один запрос диапазона, но для этого требуется шесть составных индексов [a, d], [b, d], [c, d], d, [e, d], [f, d] и объединение с помощью объединения ZigZeg. Подробно здесь http://dev.yathit.com/ydn-db/nosql-query.html Вы также можете найти требования для равного объединения.
Текущий ZigZeg быстрее, чем SortedMerge, так как в спецификации 1 IndexedDB API нет требуемых методов. Однако v2 идет с необходимыми методами, а именно openKeyCursor
а также continuePrimaryKey
, Результат ZigZeg отсортирован по d, тогда как SortedMerge отсортирован по первичному ключу.
Вместо того, чтобы хранить Date
объект, вместо этого сохраните представление метки времени:
var timestamp = new Date().getTime();
Поскольку временная метка является целым числом, вы можете эффективно использовать диапазон ключей.