2016-04-01 12 views
0

Ich verstehe, indexedDB hat nicht findOne oder finden Funktionen (wie MongoDB tut), aber was ich erreichen möchte, ist ähnlich wie diese Funktionen.findOne in indexedDB

Ich habe einen Datenspeicher in indexedDB. Ich habe einen Index für das Geschäft erstellt, zum Beispiel mit der stop_id.

Ich möchte im Laden alle Dokumente mit der stop_id finden. Mehrere Objekte können einen stop_id Wert haben.

Was ich habe:

Ich versuche, ein bisschen zu betrügen (bitte korrigieren Sie mich, wenn es einen besseren Weg)

// this function is called from html via angularjs 
    $scope.findOne = function(stop_id) { 
     var db; 
     var request = indexedDB.open("Trans"); 
     request.onerror = function(event) { 
      alert("Couldn't connect to Database"); 
     }; 
     request.onsuccess = function(event) { 
      db = event.target.result; 
      var objectStore = db.transaction("times").objectStore("times"); 
      var index = objectStore.index("stop_id"); 

      var range = IDBKeyRange.only(stop_id); 

      // call something here to retrieve 
      // One or All documents with the ID of stop_id 
      // passed in from the html 
     } 
    } 

dann würde ich wollen, wie so in html nennen:

Ich denke über den obigen Ansatz nach, da indexedDB Joins nativ nicht unterstützt, und ich möchte native indexeddb Problemumgehungen verwenden um das Extrahieren von zusätzlichen Daten in Bezug auf eine ID in einem anderen Datenspeicher im laufenden Betrieb zu erreichen. Leistung ist kein Problem. Beide Datenspeicher-Dokumente werden nicht mehr als 150 Elemente enthalten.

Antwort

0

Verwenden Sie die Methode IDBIndex get oder openCursor.

// for one 
var range = IDBKeyRange.only(myId); 
var getRequest = index.get(range); 
getRequest.onsuccess = function(event) { 
    var result = event.target.result; 
    console.log(result); 
}; 

// for multiple ... 
var getRequest = index.openCursor(range); 
var documentsFound = []; 
getRequest.onsuccess = function(event) { 
    var request = event.target; 
    var cursor = request.result; 
    if(!cursor) { 
    console.log('no match found, or no more matches found'); 
    someFunction(documentsFound); 
    } else { 
    console.log('Found:', cursor.value); 
    documentsFound.push(cursor.value); 
    cursor.advance(); 
    } 
}; 

Wenn mehrere Objekte im Speicher, um die stop_id gleichen haben, dann stellen Sie sicher, dass Sie keine unique:true Flag verwenden, wenn Sie den Index in Ihrem onupgradeneeded Handler zu schaffen.

+0

Danke. Werde es versuchen. Und ja, ich habe kein eindeutiges erstellt: wahrer Index für sie – Rexford

+0

Funktioniert nicht wie ich erwartet hatte. Ich bekomme eine Reihe von wiederholten undotinct Ergebnissen in der Konsole. Von Anfang an weiß ich nicht, ob eine Abfrage zu mehreren Objekten führt oder nicht, also ging ich mit der obigen Option fort. Ich mache wahrscheinlich etwas nicht richtig. Ich würde mich über mehr Klarheit freuen, um mir dabei zu helfen, diese ganze indexeddb-Sache zu bekommen. – Rexford

+0

Der Abschnitt, der mehrere Datensätze oben iteriert, gibt nie dasselbe Objekt zweimal zurück, aber möglicherweise können Objekte zurückgegeben werden, die ähnlich aussehen. Es listet nur alle Objekte mit dem angegebenen stop_id-Parameter auf. Ich habe ein Beispiel gezeigt, wie die passenden Stopps in ein Array geschoben wurden. Vielleicht setzen Sie das Array nicht zwischen Anrufen oder ähnlichem zurück? – Josh