【问题标题】:YDN-DB - Incorrect results using mixed data types with SortedMergeYDN-DB - 使用带有 SortedMerge 的混合数据类型的结果不正确
【发布时间】:2014-03-12 10:04:02
【问题描述】:

我将出色的 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 DB 中的错误?

【问题讨论】:

  • 你在 indexeddb 和 websql 中都测试过吗?同样的问题?
  • 我在 IE11 & Chrome 中试过了,如何强制使用 WebSQL?
  • 在选项中使用mechanisms
  • 或者,您可以尝试提供 DATE 数据类型。这将强制编码。

标签: indexeddb ydn-db


【解决方案1】:

根据我从您的代码中可以看到,“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 您还可以找到 equi join 的要求。

当前 ZigZeg 比 SortedMerge 更快,因为 IndexedDB API 规范 1 没有要求方法。但是 v2 带有 require 方法,即openKeyCursorcontinuePrimaryKey。 ZigZeg 的结果按 d 排序,而 SortedMerge 则按主键排序。

【讨论】:

  • 谢谢 - 为了清楚起见,我把数字放在那里。我的代码实际上做了一个new Date()。我将 D 列的架构切换为 INTEGER,将 IndexIterator 切换为 Number( [date_value] ),但它仍然没有显示所有预期的结果。
  • 不提供任何类型信息。无论如何,如果你给我一个单元测试,我会修复。
  • 谢谢,我会为它设置一个小提琴并在这里发布。顺便说一句,优秀的软件,写得很漂亮,非常有用:)
  • 对不起,你不能使用范围,它不起作用。这里解释一下dev.yathit.com/ydn-db/nosql-query.html
【解决方案2】:

不存储Date 对象,而是存储时间戳表示:

var timestamp = new Date().getTime();

由于时间戳是整数,因此您可以有效地在其上使用键范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2020-12-24
    相关资源
    最近更新 更多