2013-05-14 49 views
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); 
    } 
} 

上述样本中,如何让所有的电子邮件有名字“约翰” ????,如何获得keyList以“some string”开头的keysList?

回答

0

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

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

  1. 不要存储派生属性。在您的查询中,循环遍历所有员工。对于每位员工,请访问电子邮件属性,然后执行检查,然后将值推入数组(如果符合条件),然后对匹配数组执行操作。
  2. 存储冗余在你的员工商店第一-name属性。在名字属性上创建一个索引。然后通过索引和条件访问您的商店。
1

变化的过滤器是这样的:

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

您能提供一些额外的解释吗? – Barranka 2013-05-14 16:15:43

+0

@Barranka当然,你想知道什么? – 2013-05-15 01:53:32

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”开头的结果

相关问题