对 indexedDB 查询的结果进行排序

Posted

技术标签:

【中文标题】对 indexedDB 查询的结果进行排序【英文标题】:Sorting the results of an indexedDB query 【发布时间】:2012-07-14 13:52:04 【问题描述】:

我想对从 indexedDB 获得的结果进行排序。 每条记录都有结构 id, text, date,其中 'id' 是 keyPath。

我想按日期对结果进行排序。

我目前的代码如下:

  var trans = db.transaction(['msgs'], IDBTransaction.READ);
  var store = trans.objectStore('msgs');

  // Get everything in the store;
  var keyRange = IDBKeyRange.lowerBound("");
  var cursorRequest = store.openCursor(keyRange);

  cursorRequest.onsuccess = function(e) 
    var result = e.target.result;
    if(!!result == false)
        return;
    
    console.log(result.value);
    result.continue();
  ;

【问题讨论】:

见***.com/questions/12084177/… 简而言之,使用键数组作为索引。 【参考方案1】:

实际上你必须在msgs objectStore 中索引date 字段并在objectStore 上打开一个索引游标。

var cursorRequest = store.index('date').openCursor(null, 'next'); // or prev 

这将得到排序的结果。这就是应该使用索引的方式。

【讨论】:

【参考方案2】:

这是 Josh 建议的更有效的方法。

假设您在“日期”创建了一个索引:

// Use the literal "readonly" instead of IDBTransaction.READ, which is deprecated:
var trans = db.transaction(['msgs'], "readonly");
var store = trans.objectStore('msgs');
var index = store.index('date');

// Get everything in the store:
var cursorRequest = index.openCursor();
// It's the same as:
// var cursorRequest = index.openCursor(null, "next");
// Or, if you want a "descendent ordering":
// var cursorRequest = index.openCursor(null, "prev");
// Note that there's no need to define a key range if you want all the objects

var res = new Array();

cursorRequest.onsuccess = function(e) 

    var cursor = e.target.result;
    if (cursor) 
        res.push(cursor.value);
        cursor.continue();
    
    else 
        //print res etc....
    
;

更多关于光标方向的信息:http://www.w3.org/TR/IndexedDB/#cursor-concept

IDBIndex API 在这里:http://www.w3.org/TR/IndexedDB/#idl-def-IDBIndex

【讨论】:

当索引的键路径是数组时,如何获得排序结果。假设数组的类型为[string, Date]。我希望结果按Date 字段排序。【参考方案3】:

感谢 zomg,javascript irc 的 hughfdjackson,我对最终数组进行了排序。修改代码如下:

var trans = db.transaction(['msgs'], IDBTransaction.READ);
var store = trans.objectStore('msgs');

// Get everything in the store;
var keyRange = IDBKeyRange.lowerBound("");
var cursorRequest = store.openCursor(keyRange);

var res = new Array();

cursorRequest.onsuccess = function(e) 
    var result = e.target.result;
    if(!!result == false)
        **res.sort(function(a,b)return Number(a.date) - Number(b.date););**
        //print res etc....
        return;
    
    res.push(result.value);
    result.continue();
;

【讨论】:

这种方式错过了使用 indexedDB 的全部要点。您可能希望使用 indexedDB 的“索引”按非主键属性进行排序。然后,您可以在索引上打开光标并以四种方式之一进行迭代(next、prev、nextUnique、prevUnique)。您选择的非本地排序不是最佳选择。 这是有道理的。谢谢!下次使用 indexedDB 时,我会牢记这一点。

以上是关于对 indexedDB 查询的结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 ComosDb 中的聚合函数结果对查询结果进行排序?

如何对查询结果进行排序

在SELECT语句中,对查询结果进行排序的子句是啥?能消除重复行的关键字是啥?

在SELECT语句中,对查询结果进行排序的子句是啥?能消除重复行的关键字是啥?

如何对Access数据库查询结果进行重新编号排序啊,自动编号的方式也行

mysql查询结果排序