是否可以在Boolean类型字段上创建索引?
假设要存储的记录的模式为:
{
id:1,
name:"Kris",
_dirty:true
}
我创建了普通的非唯一索引(onupgradeneeded):
...
store.createIndex("dirty","_dirty",{ unique: false })
...
索引已创建,但为空!-在索引IndexedDB浏览器中,不存在具有Boolean值的记录-只有String、Numbers和Dates或甚至Arrays。
我使用的是Chrome 25金丝雀
我想查找_dirty属性设置为true的所有记录-那么我是否必须将_dirty修改为string或int?
4条答案
按热度按时间uubf1zoe1#
是,布尔值不是有效键。
如果必须,当然可以解析为1和0。
但这是有充分理由的。索引布尔值没有提供信息。在上面的例子中,您可以进行表扫描和过滤,而不是索引查询。
cedebl8k2#
标记为选中的答案不完全正确。
您不能在包含Boolean JavaScript类型值的属性上创建索引。另一个答案的这一部分是正确的。如果您有类似
var obj = {isActive: true};
的对象,则尝试在obj.isActive
上创建索引将不起作用,浏览器将报告错误消息。但是,您可以轻松地模拟所需的结果。indexedDB不会将对象中不存在的属性插入到索引中。因此,您可以定义一个属性来表示true,而不定义该属性来表示false。当该属性存在时,该对象将出现在索引中。当该属性不存在时,该对象将不会出现在索引中。
示例
例如,假设您有一个'obj'对象的对象存放区。假设您想要在这些对象的
isActive
属性上建立类似布林的索引。首先在isActive属性上创建一个索引。
要表示对象的“true”,只需使用
obj.isActive = 1;
。然后将对象添加或放入对象存储区。如果要查询设置了isActive
的所有对象,只需使用db.transaction('store').index('isActive').openCursor();
。要表示false,只需使用
delete obj.isActive;
,然后添加或或将对象放入对象存储区。当您查询设定了
isActive
的所有对象时,这些遗失isActive
属性(因为它已被删除或从未设定)的对象在使用数据指标反覆运算时将不会出现。瞧,一个 * 布尔 * 索引。
性能说明
在索引上打开一个游标,就像在这里使用的示例中所做的那样,将提供良好的性能。对于小数据,性能上的差异并不明显,但当存储大量对象时,它就非常明显了。没有必要采用第三方库来实现“布尔索引”。这是一个平凡而简单的特性,你可以自己完成。您应该尽可能地尝试使用本机功能。
9wbgstp73#
布尔值属性描述了独占状态(活动/非活动)、“开/关”、“启用/禁用”、“是/否”。为了提高可读性,您可以在JS数据模型中使用这些值对而不是布尔值。此外,此策略还允许添加其他状态(“NotSet”,用于对象中未配置某些内容的情况等)...
db2dz4w84#
我使用了
0
和1
,而不是布尔类型。