16

是否可以在布尔类型字段上创建索引?

假设我要存储的记录的架构是:

{
  id:1,
  name:"Kris",
  _dirty:true
}

我创建了正常的非唯一索引(onupgradeneeded):

...
store.createIndex("dirty","_dirty",{ unique: false })
...

索引已创建,但它是空的!- 在索引 IndexedDB 浏览器中没有带有布尔值的记录——只有字符串数字日期,甚至是数组

我正在使用 Chrome 25 金丝雀

我想查找所有将 _dirty 属性设置为 true 的记录 - 我是否必须将 _dirty 修改为 string 或 int?

4

4 回答 4

10

是的,boolean 不是有效的 key

如果必须,当然可以解析为 1 和 0。

但这是有充分理由的。索引布尔值不提供信息。在上述情况下,您可以即时进行表扫描和过滤,而不是索引查询。

于 2012-12-02T23:20:52.680 回答
8

标记为已检查的答案并不完全正确。

您不能在包含 Boolean JavaScript 类型的值的属性上创建索引。另一个答案的那部分是正确的。如果你有一个类似的对象var obj = {isActive: true};,尝试创建索引obj.isActive将不起作用,浏览器将报告错误消息。

但是,您可以轻松模拟所需的结果。indexedDB 不会将对象中不存在的属性插入索引。因此,您可以定义一个属性来表示真,而不是定义一个属性来表示假。当属性存在时,对象将出现在索引中。当属性不存在时,对象不会出现在索引中。

例子

例如,假设您有一个“obj”对象的对象存储。假设您想在isActive这些对象的属性上创建一个类似布尔值的索引。

首先在 isActive 属性上创建一个索引。在 onupgradeneeded 回调函数中,使用store.createIndex('isActive','isActive');

要表示对象的“真”,只需使用obj.isActive = 1;. 然后将对象添加或放入对象存储中。当您要查询设置的所有对象isActive时,只需使用db.transaction('store').index('isActive').openCursor();.

要表示假,只需使用delete obj.isActive;然后添加或或将对象放入对象存储中。

当您查询isActive设置了所有对象时,这些缺少该isActive属性的对象(因为它已被删除或从未设置)在使用游标迭代时不会出现。

瞧,一个布尔索引。

性能说明

像在此处使用的示例中所做的那样在索引上打开游标将提供良好的性能。小数据时性能上的差异并不明显,但在存储大量对象时非常明显。无需采用一些第三方库来完成“布尔索引”。这是您可以自己完成的平凡而简单的功能。您应该尽量使用本机功能。

于 2014-07-01T03:10:27.600 回答
0

布尔属性描述独占状态(活动/非活动)、“开/关”、“启用/禁用”、“是/否”。您可以在 JS 数据模型中使用这些值对而不是布尔值以提高可读性。这种策略还允许添加其他状态('NotSet',如果对象中没有配置某些东西等情况)......

于 2014-04-07T22:31:33.990 回答
0

我使用0and1而不是布尔类型。

于 2021-08-21T10:21:24.500 回答