索引IndexedDB中对象的数组值

时间:2016-04-28 17:26:22

标签: javascript google-chrome google-chrome-app indexeddb

对于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,例如来自关系数据库的知识:

  • 顺序
  • OrderItem的
  • 包裹

解决方案也应该以快速的方式工作,存储100.000或更多对象。

1 个答案:

答案 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的所有可能性。真的很糟糕:(