在索引数据库中,如何获取keyList,其中键以“some string”开头?

时间:2013-05-14 15:55:48

标签: html5 indexeddb

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" ????

3 个答案:

答案 0 :(得分:1)

像这样更改过滤器:

if (localDatabase != null && localDatabase.db != null) { 
    var range = IDBKeyRange.bound("john", "john" + '|', true, true);
codes...

答案 1 :(得分: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”开头的结果

答案 2 :(得分:0)

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

从一个角度来看,存储派生属性是多余的,当然。它也直观地感觉像是规范化违规。然而,这里的想法最终是磁盘空间通常便宜且可用,但时间不是。你可以在时空中做出折衷,做你想做的事。所以你有两种方式:

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