2012-04-13 6 views
3

Ich habe Dokumente mit den Feldern 'date' und 'group'. Und das ist meine Ansicht:Brauche einen CouchDB-Trick, um nach Datum zu sortieren und nach Gruppe zu filtern

byDateGroup: { 
    map: function(doc) { 
    if (doc.date && doc.group) { 
     emit([doc.date, doc.group], null); 
    } 
    } 
} 

Was die äquivalente Abfrage sein würde:

select * from docs where group in ("group1", "group2") order by date desc 

Diese einfache Lösung kommt nicht in meinen Kopf. ? :(

Antwort

1

Pankaj , wechseln Sie die Reihenfolge der zu sendenden Taste:

emit([doc.group, doc.date], doc); 

Dann können Sie bei der Abfrage der Ansicht einen Start- und einen Endschlüssel übergeben. Es ist möglicherweise einfacher, eine separate Abfrage für jede Gruppe durchzuführen, für die Sie Daten abrufen möchten. Die Daten werden nach Datum sortiert.

Ich bin im Moment auf dem Weg nach draußen, kann aber mehr ausarbeiten, wenn ich zurückkomme, wenn es nicht klar ist.

+0

+1 Dies scheint die beste Lösung zu sein. Grundsätzlich fragt Jangid nach einem Join und so sind mehrere Anfragen und das "Beitreten" beim Kunden wahrscheinlich das Einfachste. – JasonSmith

+0

Einverstanden. Dies ist derzeit der beste verfügbare Ansatz. Zusätzlich zu dem, was @JasonSmith gesagt hat, könnten Sie auch die zusätzliche Filterung in einer _list -Funktion vornehmen. In allen Fällen "sortiert" CouchDB automatisch alle Datumsschlüssel (Zeitstempel oder Datumsfelder). Der "harte Teil" ist nur die spezifischen Gruppen aus dem Index auszuwählen. – BigBlueHat

0

warum nicht

function(doc) { 
    if (doc.date && ["group1", "group2"].indexOf(doc.group) !== -1)) { 
    emit([doc.date, doc.group], null); 
    } 
} 
0

Sie benötigen eine bestimmte Ansicht für diese.

byDateGroup1Group2: { 
    map: function(doc) { 
    if (doc.date && doc.group && (doc.group === "group1" || doc.group === "group2") { 
     emit(doc.date, doc); 
    } 
    } 
} 

, die Sie abfragen (vermutlich in einer Listenfunktion) mit Abfrage descending=true