2015-02-17 43 views
6

Nel mio progetto sto usando il DB indicizzato del browser e vorrei recuperare alcuni oggetti dal db con ID specifici. Secondo MDN è possibile utilizzare gli intervalli per ottenere i risultati che si desidera:Ottenere identificativi specifici da Indexeddb

Secondo MDN:

// Only match "Donna" 
var singleKeyRange = IDBKeyRange.only("Donna"); 

// Match anything past "Bill", including "Bill" 
var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill"); 

// Match anything past "Bill", but don't include "Bill" 
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true); 

// Match anything up to, but not including, "Donna" 
var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true); 

// Match anything between "Bill" and "Donna", but not including "Donna" 
var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true); 

// To use one of the key ranges, pass it in as the first argument of openCursor()/openKeyCursor() 
index.openCursor(boundKeyRange).onsuccess = function(event) { 
    var cursor = event.target.result; 
    if (cursor) { 
    // Do something with the matches. 
    cursor.continue(); 
    } 
}; 

Tuttavia ciò che fai, se si desidera ottenere una matrice di ID specifici che non sono in ordine e non sono sequenziali (es: [91,819,34,24,501]) con una singola richiesta?

risposta

3

In base al tuo commento, sembra che tu voglia fare qualcosa come SELECT objects FROM objects WHERE object.id = 1 OR object.id = 2 OR object.id = 5, come una singola query (richiesta). Sfortunatamente, indexedDB non può fare query di stile OR (unioni). Può solo fare query di stile AND (intersezioni).

Esiste una possibile soluzione se i vari ID che si desidera recuperare sono noti a priori. È possibile semplicemente archiviare una proprietà id di gruppo aggiuntiva, inserire gli ID correlati in gruppi distinti e quindi eseguire una query in base all'ID di gruppo. Questo ovviamente non funziona se gli ID che si desidera recuperare si sovrappongono (compaiono in più di un gruppo) o sono variabili (oggetto per modificare le appartenenze di gruppo da una query a una query).

+0

Mi dispiace per la confusione, quello che vorrei realizzare è di recuperare 5 record (oggetti) con questi id [91,819,34,24,501] ma con una singola richiesta senza usare un cursore. se gli id ​​che volevo fossero ad esempio [1,2,3,4,5] allora potrei usare "IDBKeyRange.bound" ma non sono in ordine né sequenziale. Ho bisogno di oggetti con id 91 ma non di id 92, solo oggetti con id [91,819,34,24,501] e il gioco è fatto. – Syd

2

Non si può fare questo con una singola richiesta, ma si può sparare più richieste in parallelo:

var keys = [91,819,34,24,501]; 
var results = []; 
keys.forEach(function(key) { 
    store.get(key).onsuccess = function(e) { 
    results.push(e.target.result); 
    if (results.length === keys.length) { 
     // you're done! 
    } 
    }; 
}); 

notare che le richieste sono tenuti ad eseguire in ordine, per cui l'ordine della matrice results sarà corrisponde all'ordine dell'array keys. Se non viene trovata una chiave, l'indice dei risultati corrispondente conterrà undefined.

(C'è una richiesta di funzionalità per indicizzato DB a sostegno di questa direttamente:. https://github.com/w3c/IndexedDB/issues/19 ma nessun disegno API finale ancora)

Problemi correlati