IDBKeyRange.only 和 IDBKeyRange.lowerBound 一起在一个查询中

IDBKeyRange.only and IDBKeyRange.lowerBound together in one query

我需要将此 sql 查询转换为 IndexedDB 语法。

"SELECT * FROM article WHERE userid=100 AND date_created > '2015-1-15 18:00:00'"

我正在考虑这两个解决方案。

userid 指数

var articles = [];
objectStore.index('userid').openCursor(100).onsuccess = function(e){
    var cursor = e.target.result;
    if(cursor){
        var article = cursor.value;
        if(new Date(article.date_created) > new Date('2015-1-15 18:00:00')){
            articles.push(article);
        }
        cursor.continue();
    }esle{
        console.log('done');
    }
};

date_created 指数

var articles = [];
objectStore.index('date_created').openCursor(IDBKeyRange.lowerBound('2015-1-15 18:00:00')).onsuccess = function(e){
    var cursor = e.target.result;
    if(cursor){
        var article = cursor.value;
        if(article.userid === 100){
            articles.push(article);
        }
        cursor.continue();
    }esle{
        console.log('done');
    }
};

如何使用 useriddate_created 上的复合索引编写类似的查询?

嗯。尝试使用 IDKeyRange.bound:

function queryArticlesByIdDate(id, date, handleArticle) {
  var openRequest = indexedDB.open(...);
  openRequest.onupgradeneeded = function(event) {
    var db = this.result;
    var articleStore = db.createObjectStore('articles');
    articleStore.createIndex('date-id',['date_created','userid']);
  };
  openRequest.onsuccess = function(event) {
    var db = this.result;
    var articleStore = db.objectStore('articles');
    var dateIdIndex = articleStore.index('date-id');
    var lowerDate = date;
    var upperDate = new Date(date + 1); // or whatever
    var bounds = IDBKeyRange.bound([lowerDate, id], [upperDate, id]);
    var cursorRequest = dateIdIndex.openCursor(bounds);
    cursorRequest.onsuccess = function(event) {
      var cursor = this.result;
      if(!cursor) return;
      handleArticle(cursor.value);
      cursor.continue();
    };
  };
}

queryArticlesByIdDate(5, new Date(...), function handler(article) {
  console.dir(article);
});