2010-06-20 7 views
8

J'utilise CouchDB pour stocker des données sur les événements. Chaque événement a une date/heure de début et une date/heure de fin. Je voudrais créer une vue maintenant, qui me permet d'obtenir une liste de tous les événements qui se produisent à une date/heure spécifique. Mais les événements n'ont pas de dates, ils peuvent s'étaler sur plusieurs jours.Clés de plage dans CouchDB Vues

Maintenant, je ne sais pas comment je peux tenir compte dans ma fonction de vue. Malheureusement, j'ai besoin de granularité au niveau des minutes, donc l'émission d'une clé pour chaque minute pourrait ne pas être une solution valide. Alors, comment puis-je faire ça?

Merci d'avance!

+0

difficile, je ne pense pas que les requêtes de gamme sont le point fort de CouchDB. – Till

Répondre

8

Ok, voici une solution de toute façon! J'ai juste ping-ponged avec Jan (Lehnardt) de CouchDB et il m'a dit que je peux emit() plusieurs fois dans une carte. Quelque chose que je ne connaissais pas jusqu'à maintenant.

Pour le rendre plus facile pour moi-même, je suppose que votre fin et heure de début se TIMESTAMP déjà. Sinon, vous devez les convertir dans votre carte ou passer généralement à eux. Je vais aussi supposer qu'un événement commence à une minute complète (par exemple 16:51:00) et non à 16:51:23. Pareil à la date de fin.

document Exemple:

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

Voici la carte:

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 
    } 
} 

Ensuite, il devrait être facile à interroger avec startkey et endkey. Vous pouvez probablement ajouter un _list ici.

+1

Merci pour votre réponse, mais comme je l'ai déjà écrit dans ma question, "émettre une clé pour chaque minute pourrait ne pas être une solution valable". Cela est dû au fait que j'ai de très longues plages de temps sur la main (c'est-à-dire plusieurs jours). D'un autre côté, j'ai toujours besoin d'une granularité fine. Cela ne peut être réalisé qu'en émettant des milliers de clés par document, ce qui ne sera pas vraiment bien pour autant que je sache. Mais merci encore pour vos pensées. –

+0

Eh bien, les vues sont calculées une fois, puis elles sont lues. Je ne pense pas que cela devrait être un problème, mais je vois ce que vous voulez dire. – Till

4

j'ai enfin trouvé une bonne solution en utilisant GeoCouch: http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/

+1

C'est la bonne réponse, mais malheureusement, le lien est mort. – dgreisen

+0

Tirée de l'article: GeoCouch « permet des recherches spatiales à l'aide de boîtes englobantes ... index spatial de GeoCouch exige que les entrées GeoJSON (qui ne sont pas non plus liés à un format distinct comme WGS84), de sorte que nous émettons nos périodes de temps que les positions des boîtes englobantes l'axe longitudinal. les valeurs sont ignorées et mises à 0 et les valeurs latitudinales représentent les points de départ et de fin temporels codés comme des horodatages ... Ainsi, nous ... interrogeons efficacement toutes les entrées dans une période donnée. " http://web.archive.org/web/20131121023735/http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/ – dgreisen

Questions connexes