javascript - 如何在 IndexedDB 中按属性查询对象?

标签 javascript indexeddb database-cursor

我有一个 IndexedDB 对象存储,它存储以下结构的用户对象:

{ id: 1, name: "Peter", role: "admin", password: "someHash"}

对象存储创建如下:

request.onupgradeneeded = function(event){
    var db = request.result;
    var objectStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });

    objectStore.createIndex("uniqueNameIndex", "name", { unique: true  });
    objectStore.createIndex("roleIndex",       "role", { unique: false });
};

我知道如何通过对象的键(id)检索对象,而且我还能够使用游标遍历所有对象。 Here's a working demo.

我现在想做的是让所有具有特定 Angular 色的用户 - 例如。检索所有管理员,而不迭代整个对象存储。

我该怎么做?

最佳答案

function forEachAdmin(db, callback) {
  var ROLE_ADMIN = 'admin';
  var tx = db.transaction('users');
  var store = tx.objectStore('users');
  var index = store.index('roleIndex');
  var range = IDBKeyRange.only(ROLE_ADMIN);
  var request = index.openCursor(range);
  request.onsuccess = function() {
    var cursor = this.result;
    if(cursor) {
      var adminUser = cursor.value;
      callback(adminUser);
      cursor.continue();
    } else {
      // No admins found or all admins iterated
    }
  };
}

function handleAdmin(user) {
  console.log('Doing something with admin user %o', user);
}

var request = indexedDB.open('dbname');
request.onsuccess = function() {
  var db = this.result;
  forEachAdmin(db, handleAdmin);
};

关于javascript - 如何在 IndexedDB 中按属性查询对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27524031/

相关文章:

javascript - 无法读取未定义类型的属性 'push' 错误 : Cannot read property 'push' of undefined error

android - SQLite 数据库和游标

sql - 使用数据库游标有什么好处?

Javascript - 过滤包含数组的对象,其值来自另一个数组

javascript - 如何使用替换参数 json.stringify 访问嵌套对象

javascript - JQuery 检测 Flash 对象上的悬停

javascript - 服务器连接在 db.js 中可以保持多长时间?

node.js - 在 Node.js 中使用 Dexie.js

javascript - indexeddb - 列出/删除所有数据库

android - 什么时候在Android中关闭光标?