对于Chrome应用程序,我将数据存储在IndexedDB中,我有一个这样的对象:
var simplifiedOrderObject = {
"ordernumber": "123-12345-234",
"name": "Mr. Sample",
"address": "Foostreet 12, 12345 Bar York",
"orderitems": [
{
"item": "brush",
"price": "2.00"
},
{
"item": "phone",
"price": "30.90"
}
],
"parcels": [
{
"service": "DHL",
"track": "12345"
},
{
"service": "UPS",
"track": "3254231514"
}
]
}
如果我将hole对象存储在objectStore中,我可以使用“track”索引,它可以在每个订单对象中多次包含吗?
或者是否需要或者可能更好/更快将每个对象拆分成多个objectStore,例如来自关系数据库的知识:
解决方案也应该以快速的方式工作,存储100.000或更多对象。
答案 0 :(得分:4)
回答我自己的问题:我现在已经做了一些测试。看起来只能在1个objectStore中对该对象执行此操作。
另一个可行的示例对象:
var myObject = {
"ordernumber": "123-12345-234",
"name": "Mr. Sample",
"shipping": {"method": "letter",
"company": "Deutsche Post AG" }
}
Creating an index将通过以下方式完成:
objectStore.createIndex(objectIndexName, objectKeypath, optionalObjectParameters);
设置objectKeypath
后,可以在"name"
等主对象中找到一个值:
objectStore.createIndex("name", "name", {unique: false});
也可以从像"shipping.method"
这样的对象的子对象中寻址一个值:
objectStore.createIndex("shipping", "shipping.method", {unique: false});
但是无法处理存储在数组中的包含在对象中的"track"
之类的值。即使像"parcels[0].track"
那样将第一个值作为索引也不起作用。
无论如何,可以索引数组的所有简单元素(但不是对象)。
因此,以下更简单的结构将允许为数组"trackingNumbers"
中的每个parcelnumber创建索引条目:
var simplifiedOrderObject = {
"ordernumber": "123-12345-234",
"name": "Mr. Sample",
"address": "Foostreet 12, 12345 Bar York",
"orderitems": [
{
"item": "brush",
"price": "2.00"
},
{
"item": "phone",
"price": "30.90"
}
],
"trackingNumbers": ["12345", "3254231514"]
}
创建将multiEntry设置为true
时的索引:
objectStore.createIndex("tracking", "trackingNumbers", {unique: false, multiEntry: true});
无论如何,缺少在数组中索引对象值的可能性,使得使用indexedDB确实不需要复杂。这是设计上的失败。这迫使开发人员在关系数据库中执行操作,同时缺少SQL的所有可能性。真的很糟糕:(