IndexedDB根据同一store中两个字段的关系查询记录
IndexedDB query records based on the relationship between two fields in the same store
我有以下 SQL:
SELECT * FROM task WHERE finishDate > dueDate;
有没有办法查询IndexedDB存储来实现上面的功能?
我在 finishDate
和 dueDate
上都有一个索引。
您将无法将这些索引用于此查询 - 因为您要搜索的值是在比较同一对象的两个属性时计算得出的。
因此,如果您想在不更改任何数据库的情况下执行此操作,则必须遍历所有对象并找到所需的值 - 此处示例:
function findItemsWithPastDueDate(callback){
const initOpenReq = indexedDB.open(baseName);
initOpenReq.onsuccess = function() {
const db = initOpenReq.result;
const transaction = db.transaction(objectStoreName, 'readonly');
const objectStore = transaction.objectStore(objectStoreName);
const cursorRequest = objectStore.openCursor();
let aggregate = [];
cursorRequest.onsuccess = function (event){
if (event.target.result){
const val = event.target.result.value;
if(val.finishDate > && val.dueDate){
aggregate.push(val);
}
event.target.result.continue();
}
};
transaction.oncomplete = function (event) {
callback(aggregate); // return items
};
}
}
替代解决方案:如果这是您想要快速执行的查询,那么我建议您向所有记录添加一个计算字段finishDatePastDueDate
并在此字段上添加索引 - 然后您就可以在这个新创建的索引上查询记录。
我有以下 SQL:
SELECT * FROM task WHERE finishDate > dueDate;
有没有办法查询IndexedDB存储来实现上面的功能?
我在 finishDate
和 dueDate
上都有一个索引。
您将无法将这些索引用于此查询 - 因为您要搜索的值是在比较同一对象的两个属性时计算得出的。
因此,如果您想在不更改任何数据库的情况下执行此操作,则必须遍历所有对象并找到所需的值 - 此处示例:
function findItemsWithPastDueDate(callback){
const initOpenReq = indexedDB.open(baseName);
initOpenReq.onsuccess = function() {
const db = initOpenReq.result;
const transaction = db.transaction(objectStoreName, 'readonly');
const objectStore = transaction.objectStore(objectStoreName);
const cursorRequest = objectStore.openCursor();
let aggregate = [];
cursorRequest.onsuccess = function (event){
if (event.target.result){
const val = event.target.result.value;
if(val.finishDate > && val.dueDate){
aggregate.push(val);
}
event.target.result.continue();
}
};
transaction.oncomplete = function (event) {
callback(aggregate); // return items
};
}
}
替代解决方案:如果这是您想要快速执行的查询,那么我建议您向所有记录添加一个计算字段finishDatePastDueDate
并在此字段上添加索引 - 然后您就可以在这个新创建的索引上查询记录。