1
function fetchEmployeeByEmail() {
  try {
    var result = document.getElementById("result");
    result.innerHTML = "";

    if (localDatabase != null && localDatabase.db != null) {
        var range = IDBKeyRange.lowerBound("john");

        var store = localDatabase.db.transaction("employees").objectStore("employees");
        var index = store.index("emailIndex");

        index.get(range).onsuccess = function(evt) {
            var employee = evt.target.result; 
            var jsonStr = JSON.stringify(employee);
            result.innerHTML = jsonStr;   
        };
    }
  }
  catch(e){
    console.log(e);
  }
}

在上面的示例中,如何获取所有电子邮件的名字都为“john”????

4

3 回答 3

1

打开从关键字到最后一个字母更改为右边框的关键字的索引:

IDBKeyRange.bound(value, increaseLastCharCode(value), false, true);

以及更改最后一个字符的功能:

function increaseLastCharCode(str){
        return str.substring(0, str.length-1) + String.fromCharCode(str.charCodeAt(str.length-1)+1);
}

这将打开从“John”到“Joho”的索引,并且不会返回以“Joho”开头的结果

于 2013-06-05T15:45:37.727 回答
1

像这样更改过滤器:

if (localDatabase != null && localDatabase.db != null) { 
    var range = IDBKeyRange.bound("john", "john" + '|', true, true);
codes...
于 2013-05-14T15:57:52.340 回答
0

对数据库的 nosql 方法意味着您应该考虑替代存储访问模式。如果您希望支持按名字进行查询,并且希望以高效的方式执行此操作,请考虑为每个员工存储一个派生的名字属性,在此派生属性上创建一个索引,然后查询该索引。

当然,从某个角度来看,存储派生属性是多余的。它也直观地感觉像是违反规范化。但是,这里的想法最终是磁盘空间通常便宜且可用,但时间却不是。您可以在时空上进行权衡以做您想做的事。所以你有两种方法:

  1. 不要存储派生属性。在您的查询中,遍历所有员工。对于每个员工,访问 email 属性,然后进行检查,如果满足您的条件,则将值推送到数组中,然后对匹配数组执行某些操作。
  2. 在您的员工商店中冗余地存储名字属性。在 first-name 属性上创建索引。然后通过索引和条件访问您的商店。
于 2013-05-27T16:06:27.180 回答