按方向查询多字段索引,其中指定一个字段
Querying an index with multiple fields, by direction, where one field is specified
我的问题类似于 this 问题,除了我想在具有多个字段的索引上执行此操作,其中一个字段具有特定值。
因此,例如,我有一家名为 ExerciseSets 的商店。 ExerciseSets 有一个由两个字段组成的索引,exerciseId 和 performedDate。我想查询 exerciseId 为 1 的最新行(由 performedDate 确定)。
而且答案真的很相似,您需要创建一个 compound index 然后以相反的顺序从该索引中检索数据。在此示例中,我使用时间戳来存储日期。
首先您需要在 onupgradeneeded
事件期间创建复合索引:
store.createIndex('nametimestamp', ['text', 'timeStamp']);
//text and timestamp are my field names
然后将其用于您的搜索功能:
searchIndexedDB = function (value, callback) {
var request = indexedDB.open(dbName);
request.onsuccess = function(e) {
var db = e.target.result;
var trans = db.transaction(objectStoreName, 'readonly');
var store = trans.objectStore(objectStoreName);
var index = store.index('nametimestamp');
var keyRange = IDBKeyRange.bound([value,0], [value, new Date().getTime()]);
//open the index for all dates and for only one value
var openCursorRequest = index.openCursor(keyRange, 'prev');
//open the database sorted by time stamp - descending
openCursorRequest.onsuccess = function(e) {
if(e.target.result)
callback(e.target.result.value);
};
trans.oncomplete = function(e) {
db.close();
};
openCursorRequest.onerror = function(e) {
console.log("Error Getting: ", e);
};
};
request.onerror = myStorage.indexedDB.onerror;
}
我的问题类似于 this 问题,除了我想在具有多个字段的索引上执行此操作,其中一个字段具有特定值。
因此,例如,我有一家名为 ExerciseSets 的商店。 ExerciseSets 有一个由两个字段组成的索引,exerciseId 和 performedDate。我想查询 exerciseId 为 1 的最新行(由 performedDate 确定)。
而且答案真的很相似,您需要创建一个 compound index 然后以相反的顺序从该索引中检索数据。在此示例中,我使用时间戳来存储日期。
首先您需要在 onupgradeneeded
事件期间创建复合索引:
store.createIndex('nametimestamp', ['text', 'timeStamp']);
//text and timestamp are my field names
然后将其用于您的搜索功能:
searchIndexedDB = function (value, callback) {
var request = indexedDB.open(dbName);
request.onsuccess = function(e) {
var db = e.target.result;
var trans = db.transaction(objectStoreName, 'readonly');
var store = trans.objectStore(objectStoreName);
var index = store.index('nametimestamp');
var keyRange = IDBKeyRange.bound([value,0], [value, new Date().getTime()]);
//open the index for all dates and for only one value
var openCursorRequest = index.openCursor(keyRange, 'prev');
//open the database sorted by time stamp - descending
openCursorRequest.onsuccess = function(e) {
if(e.target.result)
callback(e.target.result.value);
};
trans.oncomplete = function(e) {
db.close();
};
openCursorRequest.onerror = function(e) {
console.log("Error Getting: ", e);
};
};
request.onerror = myStorage.indexedDB.onerror;
}