indexedDB 中的 IN 运算符等效项

2023-12-12

我想执行这个查询 从属性中选择 *,其中 propertyCode IN ("field1", "field2", "field3")

我怎样才能在 IndexedDB 中实现这一点 我尝试过这个东西

getData : function (indexName, params, objectStoreName) {
            var defer = $q.defer(),
                db, transaction, index, cursorRequest, request, objectStore, resultSet, dataList = [];
            request = indexedDB.open('test');
            request.onsuccess = function (event) {
                db = request.result;
                transaction = db.transaction(objectStoreName);
                objectStore = transaction.objectStore(objectStoreName);
                index = objectStore.index(indexName);
                cursorRequest = index.openCursor(IDBKeyRange.only(params));
                cursorRequest.onsuccess = function () {

                    resultSet = cursorRequest.result;
                    if(resultSet){
                        dataList.push(resultSet.value);
                        resultSet.continue();
                    }
                    else{
                        console.log(dataList);
                        defer.resolve(dataList);
                    }
                };

                cursorRequest.onerror = function (event) {
                    console.log('Error while opening cursor');
                }
            }
            request.onerror = function (event) {
                console.log('Not able to get access to DB in executeQuery');
            }
            return defer.promise;

但没有成功。我尝试谷歌但找不到确切的答案。


如果您认为 IN 本质上等同于field1 == propertyCode OR field2 == propertyCode,那么你可以说 IN 只是使用 OR 的另一种方式。

IndexedDB 无法对单个请求执行 OR(并集)。

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

另一种方法是迭代内存中的所有对象,然后过滤那些不符合条件的对象。再次,糟糕的表现。

这是一个花哨的技巧,可能会给你带来不错的性能,但它需要一些额外的工作和一点点存储开销:

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

第三种方法的示例

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);
      }
    });
  };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

indexedDB 中的 IN 运算符等效项 的相关文章

随机推荐

  • C# 中的 SafeFileHandle 是什么?何时应该使用它?

    当我还在学习 System IO 时 File Streamclass 的构造函数 我发现存在类型名为的重载构造函数SafeFileHandle 我尝试在互联网和MSDN文档上搜索 但我什么都看不懂 我发现even stranger这样的词
  • Android 小部件在 x 时间后更新

    我刚刚开始学习 Android 我正在尝试编写一个小部件 它每秒更新一次计数器 但在某个地方它缺少一些东西 我在屏幕上看到 1 我正在使用 Android 4 模拟器 package com ibluekey import java tex
  • 扩展 WP_List_Table / 处理插件管理中的复选框选项

    我正在开发一个 WordPress 插件 该插件的一部分需要扩展 WP List Table 并将该表中签入的任何项目存储到选项中 我已经设法弄清楚如何正确设置和显示所需的表格 但如何处理存储选中的选项 这是我到目前为止所得到的 class
  • 用于验证 dd-Mmm-yyyy 格式日期的正则表达式

    我有一个需要验证的文本输入框 用户应该只能输入 dd Mmm yyyy 格式的日期 例如 2013 年 6 月 1 日 2015 年 8 月 31 日等 或者他们应该能够输入 T 1 T 2 T 99 我可以使用什么样的正则表达式模式来验证
  • Cypher zip 集合

    如果我有两个集合 我如何将它们压缩在一起 with 1 2 3 as nums a b c as letters wat do return zipped a 1 b 2 c 3 可能无法动态分配映射键 例如 使用letters 但此查询将
  • 我可以在运行时以编程方式设置“android:layout_below”吗?

    创建时是否可以相对布局在运行时设置相当于android layout below以编程方式 Yes RelativeLayout LayoutParams params new RelativeLayout LayoutParams Vie
  • 如何在Python中从补丁中恢复3D图像?

    我有一个带有形状的 3D 图像DxHxW 我成功地将图像提取成补丁pdxphxpw 重叠的补丁 对于每个补丁 我都会进行一些处理 现在 我想从处理后的补丁生成图像 以便新图像必须与原始图像具有相同的形状 你能帮我做一下吗 这是我提取补丁的代
  • C# 编译器是否足够智能来优化这段代码?

    请忽略此问题中的代码可读性 从性能上来说 下面的代码是否应该这样写 int maxResults criteria MaxResults if maxResults gt 0 while accounts Count gt maxResul
  • 应用 tm 方法“stemCompletion”时一个变量的多个结果

    我有一个语料库 其中包含 3 个变量 ID 标题 摘要 的 15 个观察结果的期刊数据 我使用 R Studio 从 csv 文件中读取数据 每个观察一行 在执行一些文本挖掘操作时 我在使用 StemCompletion 方法时遇到了一些麻
  • 如何使用共享库运行 LLVM 解释器?

    I have mylib c具有某些功能的文件 我想使用我的这些功能 c文件作为已编译的 llvm 代码中的外部文件 我正在使用 LLVM 解释器 lli 4 0 我想知道我怎么知道lli使用我的函数 c file lli has a lo
  • 如何在delphi10中使用IdHTTP登录Instagram网站

    我正在尝试在 Delphi 中使用 idhttp 登录 Instagram 网站 我使用谷歌浏览器开发者工具来获取数据 这是我到目前为止所尝试过的 procedure TForm1 Button1Click Sender TObject v
  • 如何从数组中删除元素

    您好 我正在编写一些遗留代码 其内容类似于 for int i results Count 1 i gt 0 i if someCondition results Remove results i 对我来说 在仍然迭代循环的同时删除元素似乎
  • 如何从jslib插件Unity webgl调用外部javascript函数

    我现在正在开发一个 webgl 项目 我正在尝试从plugin jslib 调用index html 中的javascript 函数 我用谷歌搜索了一些方法 似乎它们不起作用 有没有正确且简单的方法来做到这一点 下面的代码是我尝试过的 索引
  • 我可以在函数(不是函数组件)内使用钩子吗

    这是我想使用我的钩子的地方 以便我可以在应用程序运行期间更改一种状态 export const simpleFunction gt state gt here is the hook 我知道反应钩子应该用在功能组件中 但是上面提到的情况又如
  • 为什么带着色器的粒子系统不起作用?三.js

    你好 有人可以帮我吗 我有这个着色器 它适用于 THREE Mesh 但不适用于 THREE Particle System 我希望每个粒子都有给定贴图 纹理 的一部分并相应地改变它们的位置 像这样http www chromeexperi
  • 使用 fread 计算行数而不读取整个文件[重复]

    这个问题在这里已经有答案了 我想使用 data table 来处理一个非常大的文件 它不符合记忆 我考虑过使用循环 适当增加跳过参数 来读取块上的文件 fread myfile csv skip loopindex nrows chunks
  • iPhone 上的 jQuery 更改事件

    我在 iPhone 4 上启动此功能时遇到问题 有什么办法吗 select change function alert you changed this 您是否尝试过 select live change function alert yo
  • 如何读取参数值,存在于规格中量角器的conf.js文件中

    例如 conf js exports config directConnect false multiCapabilities browserName firefox browserName chrome browserName inter
  • React:带参数调用函数会导致无限循环

    所以 我有一个组件可以使用 prop 渲染另一个组件 如下所示
  • indexedDB 中的 IN 运算符等效项

    我想执行这个查询 从属性中选择 其中 propertyCode IN field1 field2 field3 我怎样才能在 IndexedDB 中实现这一点 我尝试过这个东西 getData function indexName para