2010-07-09 13 views
16

J'ai essayé de comprendre comment créer une vue CouchDB qui me permettra d'interroger tous les documents qui ont une date de début supérieure à A et une date de fin inférieure à B.Interroger des documents CouchDB entre une date de début et une date de fin

Est-ce possible dans CouchDB ou dans un autre magasin de documents noSQL? Dois-je l'abandonner et revenir à SQL?

Je suis tout simplement essayer de faire l'équivalent SQL de:

SELECT * OÙ [timestamp démarrer]> = doc.start ET [horodatage final] < de doc.end;

+0

en double, voir http://stackoverflow.com/questions/3079040/range-keys-in-couchdb-views –

+0

@PartlyCloudy Je ne vois pas comment cette question est dupe de votre question. Votre question génère un tas d'événements à intervalles réguliers sur une certaine distance, alors que cela cherche à trouver toutes les valeurs entre une certaine gamme. Je pourrais juste utiliser votre solution incorrectement mais je ne pense pas. – jfenwick

Répondre

0

Utilisez startkey and endkey. De cette façon, vous pouvez décider de votre plage de dates à l'exécution sans ralentir votre requête.

8

il suffit de créer une carte comme celle-ci:

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

puis Interrogez la vue avec:

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

La vue sera triée la plus ancienne à la plus récente afin descending=true renverse cet ordre.

Si vous voulez une gamme spécifique.

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

voulez-vous obtenir tout en 1970.

doivent aider:

+7

Cela ne fonctionnerait pas car il existe deux variables différentes, doc.start et doc.end. – jfenwick

+0

Vous avez présenté une fonction anon comme réponse, mais c'est complètement hors contexte parce que vous n'avez pas dit où ou comment le placer, ou quoi l'assigner, ou comment ou quoi l'appelle. Je veux dire je l'assigne à un var dans le doc? Est-ce que je le place dans le document nu et non assigné? Peut-être que ça va dans le document? Qui sait. – ekerner

3

Utilisez un tableau clé dans votre fonction de carte

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

Ensuite, pour obtenir des documents avec une plus grande date de début puis 1970-01-01T00: 00: 00Z et une date de fin avant 1971-01-01T00: 00 : 00Z utiliser la requête

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

Quelle magie fait la première partie de la touche de fin ici? "\ ufff0" Est-ce égal à une date dans l'avenir infini? – mtnpaul

+0

@noah cela ne semble pas filtrer la partie date de fin, si la date de début correspond, donc avec la touche de fin – wprater