是否可以在布尔类型字段上创建索引?
让我们说我要存储的记录的架构是:
{
id:1,
name:"Kris",
_dirty:true
}
我创建了普通非唯一索引( onupgradeneeded ):
...
store.createIndex("dirty","_dirty",{ unique: false })
...
创建了索引,但它是空的! - 在索引IndexedDB浏览器中,没有布尔值的记录 - 仅字符串,数字和日期甚至的阵列
我正在使用Chrome 25金丝雀
我想找到_dirty属性设置为true的所有记录 - 我是否必须将_dirty修改为string或int?
答案 0 :(得分:8)
是的,boolean is not a valid key。
如果必须,您当然可以解决为1和0。
但这是有充分理由的。索引布尔值不提供信息。在上面的例子中,您可以动态地进行表扫描和过滤,而不是索引查询。
答案 1 :(得分:4)
标记为已选中的答案并不完全正确。
您无法在包含布尔JavaScript类型值的属性上创建索引。另一个答案的那一部分是正确的。如果您有var obj = {isActive: true};
之类的对象,尝试在obj.isActive
上创建索引将无效,浏览器将报告错误消息。
但是,您可以轻松模拟所需的结果。 indexedDB不会将对象中不存在的属性插入索引。因此,您可以定义一个属性来表示true,而不是定义属性来表示false。当属性存在时,对象将出现在索引中。当该属性不存在时,该对象将不会出现在索引中。
例如,假设您有一个' obj'对象。假设您要在这些对象的isActive
属性上创建类似布尔值的索引。
首先在isActive属性上创建索引。在onupgradeneeded回调函数中,使用store.createIndex('isActive','isActive');
代表' true'对于一个对象,只需使用obj.isActive = 1;
。然后将对象添加或放入对象库。如果要查询设置了isActive
的所有对象,只需使用db.transaction('store').index('isActive').openCursor();
。
要表示false,只需使用delete obj.isActive;
,然后将对象添加或放入对象库。
当您查询设置了isActive
的所有对象时,这些缺少isActive
属性的对象(因为它已删除或从未设置)在使用游标进行迭代时不会出现。
Voila,布尔索引。
在索引上打开游标就像在此处使用的示例中所做的那样,将提供良好的性能。小数据时性能差异不明显,但在存储大量对象时非常明显。没有必要采用某些第三方库来完成“布尔索引”。这是一个平凡而简单的功能,您可以自己做。您应该尝试尽可能多地使用本机功能。
答案 2 :(得分:0)
布尔属性描述独占状态(主动/非主动),'开/关','启用/禁用','是/否'。您可以在JS数据模型中使用这些值对而不是布尔值来提高可读性。此外,这种策略允许添加其他状态(' NotSet',如果没有在对象中配置某些内容等情况)......