索引IndexedDB中的对象中的数组值

Lut*_*utz 5 javascript google-chrome indexeddb google-chrome-app

对于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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我将孔对象存储在objectStore中,我可以为“ track”使用一个索引,该索引可以在每个顺序对象中多次包含吗?

还是需要或可能更好/更快地将每个对象拆分为多个objectStore,如从关系数据库中所知:

  • 订购
  • 订单项

该解决方案还应该可以快速存储100.000个或更多对象。

Lut*_*utz 6

回答我自己的问题:我已经进行了一些测试。看起来不可能仅在1个objectStore中使用该对象执行此操作。

另一个可行的示例对象:

var myObject = {
    "ordernumber": "123-12345-234",
    "name": "Mr. Sample",
    "shipping": {"method": "letter",
                 "company": "Deutsche Post AG" }
}
Run Code Online (Sandbox Code Playgroud)

创建索引将通过以下方式完成:

objectStore.createIndex(objectIndexName, objectKeypath, optionalObjectParameters);
Run Code Online (Sandbox Code Playgroud)

通过设置objectKeypath,可以在主对象中寻址一个值,例如"name"

objectStore.createIndex("name", "name", {unique: false});
Run Code Online (Sandbox Code Playgroud)

也可以通过对象的子对象来寻址值"shipping.method"

objectStore.createIndex("shipping", "shipping.method", {unique: false});
Run Code Online (Sandbox Code Playgroud)

但是,无法寻址"track"存储在数组中的,包含在对象中的值,例如。甚至"parcels[0].track"想要获得第一个值作为索引的方法也不起作用。

无论如何,有可能索引数组的所有简单元素(而不是对象)。

因此,以下更简单的结构将允许为数组中的每个宗地编号创建一个索引条目"trackingNumbers"

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"]
} 
Run Code Online (Sandbox Code Playgroud)

在将multiEntry设置为的索引时true

objectStore.createIndex("tracking", "trackingNumbers", {unique: false, multiEntry: true});
Run Code Online (Sandbox Code Playgroud)

无论如何,缺少索引数组中的对象值的可能性,使得使用indexedDB确实非常复杂。这是设计的失败。这迫使开发人员执行关系数据库中的操作,而缺少SQL的所有功能。特别糟糕 :(

  • 是的,“问题”不是“错误”。顺便说一句,我是该规范的编辑。:) (2认同)