IDBObjectStore.createIndex()中keyPath的用途是什么?

时间:2017-12-15 18:39:11

标签: javascript ecmascript-6 indexeddb idbobjectstore

我一直在MDN周围阅读,但我得到stuff like

  

keyPath
  索引使用的关键路径。请注意,可以使用空keyPath创建索引,也可以将序列(数组)作为keyPath传递。

嗯,没有s!!t,keyPath是关键路径。那是什么?

在所有examples中,它与列的名称(或索引,因为它们称之为)相同:

  objectStore.createIndex("hours", "hours", { unique: false });
  objectStore.createIndex("minutes", "minutes", { unique: false });
  objectStore.createIndex("day", "day", { unique: false });
  objectStore.createIndex("month", "month", { unique: false });
  objectStore.createIndex("year", "year", { unique: false });
你可以传递的

They say

  • 空字符串 - ""
  • 有效的JavaScript标识符(我认为这意味着有效的JS变量名称)
  • 以句点分隔的多个JavaScript标识符,例如:"name.name2.foo.bar"
  • 包含上述任何内容的数组,例如:["foo.bar","","name"]

我无法想象它的用途是什么。我绝对不明白keyPath是什么,我可以用它做什么。有人可以提供示例用法,其中keyPath不是列名吗?解释keyPath的值对数据库有什么影响?

2 个答案:

答案 0 :(得分:5)

示例可能有所帮助。如果使用带有对象存储的键路径,则可以从存储的对象中取出键,而不必在每次put()调用时指定它们。例如,对于只有id和name的记录,您可以使用记录的id作为对象存储的主键:

store = db.createObjectStore('my_store', {keyPath: 'id'});
store.put({id: 987, name: 'Alice'});
store.put({id: 123, name: 'Bob'});

这给你这个商店:

key   | value
------+-------------------
123   | {id: 123, name: 'Bob'}
987   | {id: 987, name: 'Alice'}

但是如果你想按名称查看记录,你可以创建一个索引:

name_index = store.createIndex('index_by_name', 'name');

这给你这个索引:

key     | primary key | value
--------+-------------+--------------------------
'Alice' | 987         | {id: 987, name: 'Alice'}
'Bob'   | 123         | {id: 123, name: 'Bob'}

(索引并不真正存储值的副本,只是主键。但是这种方式可视化更容易。这也解释了您在游标上看到的属性如果你遍历索引。)

现在您可以按名称查找记录:

req = name_index.get('Alice')

当记录添加到商店时,密钥路径用于生成索引的密钥。

.分隔符的关键路径可用于更复杂记录中的查找。作为数组的关键路径可以生成复合键(其中键本身是一个数组),也可以生成多个索引条目(如果指定了multiEntry: true

答案 1 :(得分:0)

密钥路径是指示indexedDB对象的哪些属性扮演特殊角色的方式。类似于向SQL数据库指示表中某个列是表的主键的方式,或者如何告诉数据库在表中的一个或多个特定列上创建索引。

换句话说,它是indexedDB实现在确定应该使用哪个属性进行某些计算时应遵循的路径。例如,在使用给定键搜索值时。

它是一个路径,而不是一个简单的密钥,因为它认为对象属性值也可以是对象。换句话说,有一个层次结构。例如,{a:{b:1}}。 "路径"值1是" a.b"。路径是要访问以获取值的属性序列。

名称的关键部分表示列起着重要作用。例如,在标识主键属性或特定索引属性时。

在indexedDB实现只是将整个对象视为一个属性包的意义上忽略了不属于keypath的属性,并且只关注那些属性,或者获得那些属性的意识,这些属性是的keyPath。