2017-09-26 3 views
0

J'utilise Dexie.JS pour travailler avec IndexedDB. À l'heure actuelle, ont une requête stupide écrit:Optimisation de la requête IndexedDB

return db.events.each((element) => { 
    let d = element.cause.data; 
    if (d.hasOwnProperty('deleted') && (false == d.deleted) && 
     d.hasOwnProperty('abbreviation') && 
     d.hasOwnProperty('contents') && (d.abbreviation == key)) { 
    snippet = d.contents; 
    } 
}).then(() => { 
    return snippet; 
}); 

Il fonctionne correctement, mais lent comme la mélasse sur une grande base de données. Dois-je exécuter chacun sur une collection faite à partir de db.events avec where appliqué? Est-ce que cela améliorerait les performances?

Merci

+0

Essayé en utilisant 'keyPath's dans diverses clauses comme' (cause.data) '- J'ai une exception à propos d'un index manquant. –

Répondre

1

Oui si en supposant que votre variable "clé" est d'un type indexable: chaîne, numéro, date, TypedArray ou Array, vous pouvez optimiser la requête comme ceci:

Tout d'abord, assurez-vous d'ajouter l'index "cause.data.abbreviation" sur db.events:

db.version(2).stores({ 
    events: 'yourPrimaryKey, cause.data.abbreviation' 
}); 

Ensuite, réécrire la requête comme ceci:

return db.events 
    // Let indexedDB sort out all items matching given key: 
    .where('cause.data.abbreviation').equals(key) 
    // Filter the rest manually using Collection.filter(): 
    .filter(element => { 
    let d = element.cause.data; 
    return (d.hasOwnProperty('deleted') && (false == d.deleted) && 
     d.hasOwnProperty('contents')); 
    }) 
    // Execute the query and only return the first match: 
    .first();