2010-07-09 8 views
16

Ich habe versucht, herauszufinden, wie ich eine CouchDB-Ansicht erstellen kann, mit der ich alle Dokumente abfragen kann, die ein Startdatum größer als A und ein Enddatum kleiner als haben B.Abfrage von CouchDB-Dokumenten zwischen einem Startdatum und einem Enddatum

Ist das in CouchDB oder einem anderen noSQL-Dokumentspeicher möglich? Sollte ich es verwerfen und zurück zu SQL gehen?

ich einfach bin versucht, die SQL-Äquivalent zu tun:

SELECT * WHERE [Zeitstempel Start]> = doc.start und [Ende Zeitstempel] < doc.end;

+0

Duplizieren verwenden, finden Sie http://stackoverflow.com/questions/3079040/range-keys-in-couchdb-views –

+0

@PartlyCloudy ich sehe, wie sich diese Frage nicht ein Betrogene ist deiner Frage. Ihre Frage generiert eine Reihe von Ereignissen in regelmäßigen Abständen über einen bestimmten Bereich, während dies versucht, alle Werte zwischen einigen Bereichen zu finden. Ich könnte Ihre Lösung nur falsch verwenden, aber ich denke nicht. – jfenwick

Antwort

0

Verwenden Sie startkey and endkey. Auf diese Weise können Sie Ihren Datumsbereich zur Laufzeit festlegen, ohne Ihre Abfrage zu verlangsamen.

8

Erstellen Sie einfach eine Karte wie folgt aus:

function (doc) {emit(doc.timestamp, 1)} 

dann mit der Ansicht Abfrage:

?descending=true&limit=10&include_docs=true // Get the latest 10 documents 

Die Ansicht älteste sortier wird spätestens so descending=true kehrt dieser Reihenfolge.

Wenn Sie einen bestimmten Bereich möchten.

?startkey="1970-01-01T00:00:00Z"&endkey="1971-01-01T00:00:00Z" 

würde erhalten Sie alles, was im Jahr 1970

Diese helfen sollte:

+7

Das würde nicht funktionieren, weil es zwei verschiedene Variablen gibt, doc.start und doc.end. – jfenwick

+0

Sie haben eine Anon-Funktion als Antwort angegeben, aber sie ist völlig aus dem Zusammenhang gerissen, weil Sie nicht gesagt haben, wo oder wie Sie sie platzieren sollen oder wozu und wie oder wie sie aufgerufen wird. Ich meine, weise ich es einer Var im Doc zu? Platziere ich es im Dokument frei und nicht zugewiesen? Vielleicht geht es überhaupt in den Doc? Wer weiß. – ekerner

3

Verwenden Sie ein Array-Schlüssel in Ihrer Map-Funktion

function (doc) { 
    var key = [doc.start, doc.end] 
    emit(key, doc) 
} 

Dann mit einem Startdatum größer Dokumente erhalten dann 1970-01-01T00: 00: 00Z und ein Enddatum vor 1971-01-01T00: 00 : 00Z die Abfrage

?startkey=["1970-01-01T00:00:00Z", ""]&endkey=["\ufff0", "1971-01-01T00:00:00Z"] 
+2

Welche Magie macht der erste Teil des Schlussschlüssels hier? "\ ufff0" Ist es gleich einem Datum in der unendlichen Zukunft? – mtnpaul

+0

@noah das scheint den Enddatumsteil nicht herauszufiltern, wenn das Startdatum übereinstimmt, also mit dem Ende-Schlüssel – wprater

Verwandte Themen