Javascript 优化IndexedDB查询
我正在使用Javascript 优化IndexedDB查询,javascript,nosql,indexeddb,dexie,Javascript,Nosql,Indexeddb,Dexie,我正在使用Dexie.JS来处理IndexedDB。 目前,有一个愚蠢的查询写为: return db.events.each((element) => { let d = element.cause.data; if (d.hasOwnProperty('deleted') && (false == d.deleted) && d.hasOwnProperty('abbreviation') && d.has
Dexie.JS
来处理IndexedDB
。
目前,有一个愚蠢的查询写为:
return db.events.each((element) => {
let d = element.cause.data;
if (d.hasOwnProperty('deleted') && (false == d.deleted) &&
d.hasOwnProperty('abbreviation') &&
d.hasOwnProperty('contents') && (d.abbreviation == key)) {
snippet = d.contents;
}
}).then(() => {
return snippet;
});
它工作正常,但速度很慢,就像大型数据库中的糖蜜一样。我是否应该使用appliedwhere
,在db.events生成的集合上运行每个事件?这会提高性能吗
谢谢是如果假设您的“key”变量是可索引类型:字符串、数字、日期、类型Darray或数组,您可以像这样优化查询:
return db.events
// Let indexedDB sort out all items matching given key:
.where('cause.data.abbreviation').equals(key)
// Filter the rest manually using Collection.filter():
.filter(element => {
let d = element.cause.data;
return (d.hasOwnProperty('deleted') && (false == d.deleted) &&
d.hasOwnProperty('contents'));
})
// Execute the query and only return the first match:
.first();
首先,确保在db.events上添加索引“cause.data.缩写”:
db.version(2).stores({
events: 'yourPrimaryKey, cause.data.abbreviation'
});
然后,按如下方式重写查询:
return db.events
// Let indexedDB sort out all items matching given key:
.where('cause.data.abbreviation').equals(key)
// Filter the rest manually using Collection.filter():
.filter(element => {
let d = element.cause.data;
return (d.hasOwnProperty('deleted') && (false == d.deleted) &&
d.hasOwnProperty('contents'));
})
// Execute the query and only return the first match:
.first();
尝试在各种子句(如
(cause.data)
)中使用keyPath
s-遇到有关缺少索引的异常。