2016-04-28 2 views
2

Для приложения Chrome, которым хранит данные в IndexedDB, у меня есть объект вроде этого:значение индексирования массива в объекте в 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 и, могу я использовать индекс для «дорожки», который может содержаться несколько раз в каждом объекте заказа?

Или это необходимо или, возможно, лучше/быстрее, чтобы разделить каждый объект на несколько objectStores, как известно из реляционных БД:

  • порядка
  • OrderItem
  • посылок

Решение должно также быстро работают с 100 000 или более объектов.

ответ

3

Отвечая на мой собственный вопрос: сейчас я провел несколько тестов. Похоже, что это невозможно сделать с этим объектом только в 1 объектеStore.

Другим примером объекта, который будет работать:

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}); 

Было бы также b е можно обратиться значение образуют подобъект объекта, как "shipping.method":

objectStore.createIndex("shipping", "shipping.method", {unique: false}); 

НО это не представляется возможным решить значения, как те, о "track", которые содержатся в объектах, хранящихся в массиве. Даже что-то вроде "parcels[0].track", чтобы получить первое значение в качестве индекса, не работает.

Во всяком случае, можно было бы индексировать все простые элементы массива (но не объекты).

Так нижеследующее более простая структура позволит создать запись индекса для каждого parcelnumber в массиве "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. Действительно плохо :(

+0

Вы правы - текущий API с индексированным DB не делает это легким. У меня есть ошибка отслеживания этой проблемы здесь: https://github.com/w3c/IndexedDB/issues/35 –

+0

я бы сказал, что это не ошибка, потому что она работает так, как написано в [спецификация] (https: //w3c.github.И.О./IndexedDB/# ключ-путь-конструкт). Но это действительно недостающая особенность ... :( – Lutz

+1

Да, «проблема» не «ошибка». Кстати, я редактор спецификации. :) –

Смежные вопросы