我想熟悉indexedDB来构建我的Firefox WebExtension。
我的样本数据结构如下:
const sampleDataRaw = [
{
"ent_seq" : 1413190,
"att1" : [ {
"sub11" : "content1",
"sub12" : [ "word" ]
}, {
"sub11" : "content2"
} ],
"att2" : [ {
"sub21" : "other content",
"sub22" : [ "term" ]
} ]
}, {
"ent_seq" : 1000010,
"att2" : [ {
"sub21" : "more content"
}, {
"sub22" : "more words"
} ]
}
] // end sampleRawData
我打开/创建我的数据库,添加这个示例数据并使用objectStore.get()和objectStore.openCursor()通过ent_seq键查询它。
当我想使用我应该为这些创建的索引搜索sub11或sub21字段时会出现问题:
objectStore.createIndex("sub11Elements", "att1.sub11", { unique: false });
objectStore.createIndex("sub21Elements", "att2.sub21", { unique: false });
当我想搜索字段sub11时如下:
var index = objectStore.index("sub11Elements");
index.get("content1").onsuccess = function(event) {
// I should have the first object of my data now, alas the result is undefined instead
};
它肯定会成功,但返回的值是未定义的,因为get()实际上没有找到任何内容。
我想知道它为什么找不到该条目以及如何找到它。我认为这可能是因为密钥路径错误,但如上所述,如果我改为搜索键(ent_seq)我可以成功获得result.att1 [i] .sub11值。
在mozilla的网站上,声明键可以是字符串和数组(或数组中的数组等),键路径部分应该使用点连接。
从stackexchange上搜索到目前为止我发现在keypath中不可能有变量键,但不管怎么说都不应该这样。
因此,我真的没有看到可能导致搜索在数据库中找不到对象的原因。
答案 0 :(得分:2)
.
访问器访问子属性,而不是数组的索引。IDBObjectStore.prototype.get
总是在没有错误时成功,并不表示是否找到匹配。关于第1点的更多内容。请看"att1":[{"sub11" : "content1","sub12" : [ "word" ]}...
。假装这是一个真正的基本JavaScript对象。你能使用att1.sub11
吗?不可以。因为att1
的值是数组,而不是对象。