在IndexedDB中对对象中的数组值进行索引

8
对于一个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"
        }
    ]
}

如果我将整个对象存储在objectStore中,是否可以使用“track”的索引,其中每个订单对象中可能包含多个该值?
或者,是否需要或可能更好/更快地将每个对象拆分为多个类似于关系数据库中的对象存储:
- 订单 - 订单项 - 包裹
解决方案也应该能够快速处理存储100,000个或更多对象。
1个回答

10

回答自己的问题:我现在已经做了一些测试。看起来不可能只使用一个对象存储来完成这个操作。

另一个可以工作的示例对象:

var myObject = {
    "ordernumber": "123-12345-234",
    "name": "Mr. Sample",
    "shipping": {"method": "letter",
                 "company": "Deutsche Post AG" }
}

创建索引的方法如下:

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" 中的每个包裹号创建索引条目:

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


你是正确的 - 当前的 Indexed DB API 并不容易实现这一点。我在这个问题上有一个跟踪 bug:https://github.com/w3c/IndexedDB/issues/35 - Joshua Bell
我会说这不是一个漏洞,因为它按照规范所写的方式运行。但这确实是一个缺失的功能... :( - Lutz
1
是的,“issue”而不是“bug”。顺便说一下,我是规范的编辑。 :) - Joshua Bell
1
看起来你忘记了这个功能 ;) - Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接