对 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语句中,对查询结果进行排序的子句是啥?能消除重复行的关键字是啥?