2016-07-21 3 views
1

Ich benutze PouchDb und das Plugin PouchDb-find, um meine lokale Datenbank in einer ionischen Web-App abzufragen. In fast jedem Anwendungsfall, ich die folgende Warnung erhalten, wenn die Abfrage während ich einen Index erstellt haben:PouchDb find: Warum wird mein Index nicht benutzt?

{ 
    "docs": { 
     ... 
    }, 
    "warning": "no matching index found, create an index to optimize query time" 
} 

Ausgehend von einem Beispiel für die Plugin-Dokumentation, bekomme ich diese Warnung so, was ich frage mich, ich tue, falsch . Hier

ein Beispiel:

var db = new PouchDB('test'); 

var docs = []; 
for (var i = 0; i < 10; i++) { 
    docs.push({title: 'Lorem ipsum ' + i, _id: 'doc' + (i + 1)}); 
} 

db.bulkDocs(docs) 
    .then(
    function() { 
     return db.createIndex({index: {fields: ['title']}}); 
    }) 
    .then(
    function() { 
     // return db.find({selector: {title: {$eq: 0}}}); // No warning 
     return db.find({selector: {title: {$ne: 0}}}); // Warning 
    }) 
    .then(
    function (res) { 
     console.log(res); 
    }) 
    .catch(console.error.bind(console)); 

Warum der Index wird verwendet, wenn $eq verwendet und ist nicht mit $ne?

Dann habe ich einen komplexeren Fall mit der folgenden Abfrage (unter der Annahme 'a.deep.property' existiert immer und ist ein Array):

db.find(
    { 
     selector: { 
      $not:{ 
       "a.deep.property": {$size:0} 
      } 
     } 
    } 
); 

I 'a.deep.property' einen Index mit dem Feld erstellt haben. Der Index wird auch nicht verwendet. Welchen Index muss ich erstellen?

Ich habe auch versucht, einen Index manuell zu erstellen und query() im vorherigen Fall zu verwenden, aber das war langsamer als mit PouchDb-find.

Irgendeine Idee?

Antwort

2

$ne verwendet derzeit keinen Index. Sie müssten stattdessen etwas wie $gt oder $lt verwenden. Z.B. anstelle von $ne: 0 würden Sie {$gt: 0, $lt: 0} tun.

+0

Vielen Dank für Ihre Antwort. Die Verwendung von '{$ gt: 0, $ lt: 0}' ist sehr clever. Ich nehme an, mein zweiter Anwendungsfall mit '$ not ', einer tiefen Eigenschaft und' $ size' verwendet keinen Index, oder? Übrigens weiß ich nicht, welche Operatoren einen Index verwenden oder nicht, aber ich denke, dass es in der Readme-Datei des Projekts erwähnt wird, um diese Art von Fragen zu vermeiden. Warte auf deine Antwort auf meine Frage in diesem Kommentar, um deine erste Antwort zu akzeptieren. – bgondy

Verwandte Themen