Javascript indexedDB中的算子内等价

Javascript indexedDB中的算子内等价,javascript,range,indexeddb,Javascript,Range,Indexeddb,我想执行这个查询 从propertyCode所在的属性中选择*(“field1”、“field2”、“field3”) 如何在IndexedDB中实现这一点 我试过这个东西 getData:function(indexName、params、objectStoreName){ var defer=$q.defer(), 数据库、事务、索引、游标请求、请求、对象存储、结果集、数据列表=[]; 请求=indexedDB.open('test'); request.onsuccess=函数(事件){

我想执行这个查询 从propertyCode所在的属性中选择*(“field1”、“field2”、“field3”)

如何在IndexedDB中实现这一点 我试过这个东西

getData:function(indexName、params、objectStoreName){
var defer=$q.defer(),
数据库、事务、索引、游标请求、请求、对象存储、结果集、数据列表=[];
请求=indexedDB.open('test');
request.onsuccess=函数(事件){
db=请求。结果;
transaction=db.transaction(objectStoreName);
objectStore=transaction.objectStore(objectStoreName);
index=objectStore.index(indexName);
cursorRequest=index.openCursor(仅IDBKeyRange.only(params));
cursorRequest.onsuccess=函数(){
结果集=cursorRequest.result;
如果(结果集){
dataList.push(resultSet.value);
resultSet.continue();
}
否则{
console.log(数据列表);
延迟解析(数据列表);
}
};
cursorRequest.onerror=函数(事件){
log(“打开光标时出错”);
}
}
request.onerror=函数(事件){
log('无法访问executeQuery中的数据库');
}

返回延迟。承诺;

如果你认为In本质上等同于代码> Field1==PrimeType或Field2==PrimeTyCys<代码>,那么你可以说In只是另一种使用或./P>的方式。 IndexedDB无法从单个请求执行或(联合)

一般来说,你唯一的选择是做单独的请求,然后将它们合并到内存中。一般来说,这将不会有很好的性能。如果你正在处理很多对象,你可能会考虑完全放弃这种方法,并思考如何避免这样的方法。

另一种方法是迭代内存中的所有对象,然后过滤那些不符合条件的对象。同样,性能糟糕

下面是一个可能给您带来不错性能的噱头,但它需要一些额外的工作和一点点存储开销:

  • 在对象中存储一个额外字段。例如,计划使用名为
    的属性hasPropertyCodeX
  • 只要3个属性中的任何一个为true(代码正确),就设置字段(如中所示,只需将其作为对象的属性,其值是无关的)
  • 当这3个属性都不为真时,请从对象中删除该属性
  • 每当修改对象时,更新派生属性(根据需要设置或取消设置)
  • 在indexedDB中为此派生属性创建索引
  • 在索引上打开光标。只有属性存在的对象才会显示在光标结果中
第三种方法的示例

如果您认为In本质上等同于代码> Field1= = PrimeType或Field2==PrimeTyCys<代码>,那么您可以说In只是另一种使用或./P>的方式。 IndexedDB无法从单个请求执行或(联合)

一般来说,你唯一的选择是做单独的请求,然后将它们合并到内存中。一般来说,这将不会有很好的性能。如果你正在处理很多对象,你可能会考虑完全放弃这种方法,并思考如何避免这样的方法。

另一种方法是迭代内存中的所有对象,然后过滤那些不符合条件的对象。同样,性能糟糕

下面是一个可能给您带来不错性能的噱头,但它需要一些额外的工作和一点点存储开销:

  • 在对象中存储一个额外字段。例如,计划使用名为
    的属性hasPropertyCodeX
  • 只要3个属性中的任何一个为true(代码正确),就设置字段(如中所示,只需将其作为对象的属性,其值是无关的)
  • 当这3个属性都不为真时,请从对象中删除该属性
  • 每当修改对象时,更新派生属性(根据需要设置或取消设置)
  • 在indexedDB中为此派生属性创建索引
  • 在索引上打开光标。只有属性存在的对象才会显示在光标结果中
第三种方法的示例
什么是objectStore?在哪里定义itI已经更新了代码..请检查作为参数传递的是什么?IDBKeyRange.only()生成一个只跨一个键的范围。因此,此游标将只生成一条记录。如果您希望参数是要获取的键的列表,您可以简单地在参数上迭代并发出get()对于每一个。我如何在列表上进行迭代?请编写一个示例代码。什么是objectStore?在哪里定义itI?我已经更新了代码。请检查作为参数传递的是什么?IDBKeyRange.only()生成一个仅跨单个键的范围。因此,此游标将只生成一条记录。如果您希望params成为要获取的键的列表,则只需在params上迭代并发出get()对于每一个。我如何迭代列表?你能写一个示例代码吗?谢谢回复@Josh。但我无法实现。你能写一个示例代码吗。这将是一个很大的帮助。谢谢回复@Josh。但我无法实现。你能写一个示例代码吗。这将是一个很大的帮助。
var request = indexedDB.open(...);
request.onupgradeneeded = upgrade;

function upgrade(event) {
  var db = event.target.result;
  var store = db.createObjectStore('store', ...);

  // Create another index for the special property
  var index = store.createIndex('hasPropCodeX', 'hasPropCodeX');
}

function putThing(db, thing) {

  // Before storing the thing, secretly update the hasPropCodeX value
  // which is derived from the thing's other properties
  if(thing.field1 === 'propCode' || thing.field2 === 'propCode' || 
    thing.field3 === 'propCode') {
    thing.hasPropCodeX = 1;
  } else {
    delete thing.hasPropCodeX;
  }

  var tx = db.transaction('store', 'readwrite');
  var store = tx.objectStore('store');
  store.put(thing);
}

function getThingsWherePropCodeXInAnyof3Fields(db, callback) {
  var things = [];
  var tx = db.transaction('store');
  var store = tx.objectStore('store');
  var index = store.index('hasPropCodeX');
  var request = index.openCursor();
  request.onsuccess = function(event) {
    var cursor = event.target.result;
    if(cursor) {
      var thing = cursor.value;
      things.push(thing);
      cursor.continue();
    } else {
      callback(things);
    }
  };
  request.onerror = function(event) {
    console.error(event.target.error);
    callback(things);
  };
}

// Now that you have an api, here is some example calling code
// Not bothering to promisify it
function getData() {
  var request = indexedDB.open(...);
  request.onsuccess = function(event) {
    var db = event.target.result;
    getThingsWherePropCodeXInAnyof3Fields(db, function(things) {
      console.log('Got %s things', things.length);
      for(let thing of things) {
        console.log('Thing', thing);
      }
    });
  };
}