2010-06-20 4 views
8

Sto usando CouchDB per memorizzare i dati sugli eventi. Ogni evento ha una data/ora di inizio e una data/ora di fine. Mi piacerebbe creare una vista ora, che mi permetta di ottenere un elenco di tutti gli eventi che si verificano in una data/ora specifica. Ma gli eventi non hanno una singola data, possono durare più giorni.Range Keys in CouchDB Views

Ora non so come posso riflettere questo nella mia funzione di visualizzazione. Sfortunatamente, ho bisogno di granularità al livello dei minuti, quindi emettere una chiave per ogni minuto potrebbe non essere una soluzione valida. Quindi, come posso farlo?

Grazie in anticipo!

+0

dura, non credo che le query sono gamma di forza di CouchDB. – Till

risposta

8

Ok, ecco una soluzione comunque! Ho appena fatto un ping-pong con Jan (Lehnardt) di CouchDB e mi ha detto che posso fare emit() più volte all'interno di una mappa. Qualcosa che non sapevo fino ad ora.

Per rendere più semplice per me stesso, suppongo che la tua fine e l'ora di inizio siano già valori TIMESTAMP. In caso contrario, è necessario convertirli nella mappa o in genere passare a essi.

Suppongo anche che un evento inizi a un minuto intero (ad esempio 16:51:00) e non a 16:51:23. Lo stesso alla data di fine.

documento Esempio:

{ 
    "_id" : "super-random-id", 
    "name" : "event 1", 
    "start" : "TIMESTAMP", 
    "end" : "TIMESTAMP" 
} 

Ecco la mappa:

function (doc) { 
    if (doc.start == undefined || doc.end == undefined) { 
     return; 
    } 
    var current = doc.start; 
    while (current <= doc.end) { 
     emit(current, doc.id); 
     current = current + 60; // increment by 1 minute 
    } 
} 

allora dovrebbe essere facile da interrogare con startkey e endkey. Probabilmente potresti aggiungere un _list qui.

+1

Grazie per la risposta, ma come ho già scritto nella mia domanda, "emettere una chiave per ogni minuto potrebbe non essere una soluzione valida". Ciò è dovuto al fatto che ho intervalli di tempo molto lunghi sulla mano (cioè più giorni). D'altra parte ho ancora bisogno di una granularità fine. Questo può essere ottenuto solo emettendo migliaia di chiavi per documento, che non sarà veramente scalabile per quanto ne so. Ma grazie ancora per i tuoi pensieri. –

+0

Bene, le viste vengono calcolate una volta e poi vengono letti. Non penso che dovrebbe essere un problema, ma capisco cosa intendi. – Till

4
+1

Questa è la risposta giusta, ma sfortunatamente il collegamento è morto. – dgreisen

+0

Dall'articolo: GeoCouch "consente ricerche spaziali utilizzando caselle di delimitazione ... L'indice spaziale di GeoCouch prevede che le voci di GeoJSON (che non sono anche legate a nessun formato distinto come WGS84), così emettiamo i nostri periodi di tempo come posizioni con caselle di delimitazione. i valori vengono ignorati e impostati su 0 ei valori latitudinali rappresentano l'inizio temporale e il punto finale codificati come timestamp, quindi ... interrogiamo efficacemente tutte le voci entro un determinato periodo. " http://web.archive.org/web/20131121023735/http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/ – dgreisen