2016-04-28 11 views
2

Für ein Chrome app, weichen speichern Daten in IndexedDB, ich habe ein Objekt wie folgt:Indexing Array-Werte in einem Objekt in einem 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" 
     } 
    ] 
} 

Wenn i das Loch Objekt in einem Objektspeicher gespeichert wird, kann ich verwende ein Index für "Spur", der in jedem Auftragsobjekt mehrfach enthalten sein kann?

Oder ist es erforderlich oder möglicherweise besser/schneller jedes Objekt in mehrere objectStores wie Know von relationalen DBs aufzuspalten:

  • bestellen
  • OrderItem
  • Paket

Die Lösung sollte arbeiten auch schnell mit 100.000 oder mehr gespeicherten Objekten.

Antwort

3

Ich beantworte meine eigene Frage: Ich habe jetzt einige Tests gemacht. Es sieht so aus, als ob es nicht möglich ist, dies mit diesem Objekt in nur 1 Objektspeicher zu tun.

Ein anderes Beispiel Objekt, das funktionieren würde:

objectStore.createIndex(objectIndexName, objectKeypath, optionalObjectParameters); 

Mit der Einstellung objectKeypath es möglich ist, einen Wert in der Hauptsache wie "name" Adresse:

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

Creating an index wird durch getan werden

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

Es wäre auch b e möglich, ein Wert bildet eine Subobjekt eines Objekts wie "shipping.method" zur Adresse:

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

aber es ist nicht möglich, Werte wie die, die von "track" zu adressieren, die in Objekten enthalten sind, in einem Array gespeichert. Sogar etwas wie "parcels[0].track", um den ersten Wert als Index zu erhalten, funktioniert nicht.

Jedenfalls wäre es möglich, alle einfachen Elemente eines Arrays (aber keine Objekte) zu indizieren.

So die folgende einfache Struktur würde es ermöglichen für jeden parcelnumber in dem Array einen Indexeintrag erstellen "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"] 
} 

wenn den Index mit multiEntry Satz true erstellen:

objectStore.createIndex("tracking", "trackingNumbers", {unique: false, multiEntry: true}); 

Wie auch immer, die fehlende Möglichkeit, Objektwerte in Arrays zu indexieren, macht die Verwendung von indexedDB wirklich unnötig kompliziert. Es ist ein Fehler im Design. Dies zwingt den Entwickler, Dinge wie in relationalen DBs zu tun, während ihm alle Möglichkeiten von SQL fehlen. Wirklich schlecht :(

+0

Sie haben Recht - die aktuelle indizierte DB-API macht das nicht einfach. Ich habe einen Tracking-Fehler für dieses Problem hier: https://github.com/w3c/IndexedDB/issues/35 –

+0

Ich würde sagen, das ist kein Bug, weil es so funktioniert, wie es in der [Spezifikation] (https: //w3c.github.io/IndexedDB/# Schlüsselpfadkonstrukt). Aber es ist wirklich ein fehlendes Feature ... :( – Lutz

+1

Ja, "Problem" nicht "Bug". BTW, ich bin der Editor der Spezifikation. :) –