IDBKeyRange

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

IDBKeyRange 接口是 IndexedDB API 的一部分,它表示用于键的连续数据类型区间。记录可以从 IDBObjectStoreIDBIndex 对象中检索,可以使用键或键的范围。您可以通过设置上下界来限制范围。例如,您可以遍历 A-Z 值范围内所有键的值。

键范围可以是单个值,也可以是带有上界和下界(或端点)的范围。如果键范围同时具有上界和下界,则它被认为是有界的;如果它没有任何界限,则被认为是无界的。有界的键范围可以是开放的(不包含端点)或闭合的(包含端点)。要检索某个范围内的所有键,您可以使用以下代码结构:

Range 代码
所有键 ≥ x IDBKeyRange.lowerBound(x)
所有键 > x IDBKeyRange.lowerBound(x, true)
所有键 ≤ y IDBKeyRange.upperBound(y)
所有键 < y IDBKeyRange.upperBound(y, true)
所有键 ≥ x && ≤ y IDBKeyRange.bound(x, y)
所有键 > x && < y IDBKeyRange.bound(x, y, true, true)
所有键 > x && ≤ y IDBKeyRange.bound(x, y, true, false)
所有键 ≥ x && < y IDBKeyRange.bound(x, y, false, true)
键 = z IDBKeyRange.only(z)

当以下条件都为真时,一个键属于一个键范围:

  • 键范围的下界值是以下情况之一:

    • undefined
    • 小于键值
    • 等于键值(如果 lowerOpenfalse)。
  • 键范围的上界值是以下情况之一:

    • undefined
    • 大于键值
    • 等于键值(如果 upperOpenfalse)。

实例属性

IDBKeyRange.lower 只读

键范围的下界。

IDBKeyRange.upper 只读

键范围的上界。

IDBKeyRange.lowerOpen 只读

如果下界值包含在键范围内,则返回 false。

IDBKeyRange.upperOpen 只读

如果上界值包含在键范围内,则返回 false。

静态方法

IDBKeyRange.bound()

创建一个具有上界和下界的新键范围。

IDBKeyRange.only()

创建一个包含单个值的新键范围。

IDBKeyRange.lowerBound()

创建一个仅有下界的键范围。

IDBKeyRange.upperBound()

创建一个具有上界的键范围。

实例方法

IDBKeyRange.includes()

返回一个布尔值,指示指定的键是否在键范围内。

示例

下面的示例说明了如何使用键范围。这里我们将 keyRangeValue 声明为一个介于 "A""F" 之间的范围。我们打开一个事务(使用 IDBTransaction)和一个对象存储,并使用 IDBObjectStore.openCursor 打开一个游标,将 keyRangeValue 声明为其可选的键范围值。这意味着游标只会检索键在此范围内的记录。此范围包含值 "A""F",因为我们没有声明它们应该是开放的界限。如果我们使用 IDBKeyRange.bound("A", "F", true, true);,那么该范围将不包括 "A""F",而只包含它们之间的值。

注意:有关一个更完整的示例,允许您尝试键范围,请查看我们的 IDBKeyRange-example 仓库(也可以 在线查看示例)。

js
function displayData() {
  const keyRangeValue = IDBKeyRange.bound("A", "F");

  const transaction = db.transaction(["fThings"], "readonly");
  const objectStore = transaction.objectStore("fThings");

  objectStore.openCursor(keyRangeValue).onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const listItem = document.createElement("li");
      listItem.textContent = `${cursor.value.fThing}, ${cursor.value.fRating}`;
      list.appendChild(listItem);

      cursor.continue();
    } else {
      console.log("Entries all displayed.");
    }
  };
}

规范

规范
Indexed Database API 3.0
# keyrange

浏览器兼容性

另见