2016-03-01 1 views
0

Je documents Couchbase au format suivantvue Couchbase pour filtrer les données entre la plage de dates

{ 
    "docType": "scheduledJob", 
    "orgId": 2, 
    "jobs": { 
    "1456753078157": { 
     "jobName": "Job1", 
     "jobId": "910271049", 
     "fromTime": 1456752600000, 
     "toTime": 1456824600000, 
     "key": 1456753141401, 
     "status": "pending" 
    }, 
    "1456753141401": { 
     "jobName": "Job2", 
     "jobId": "558624841", 
     "fromTime": 1456752600000, 
     "toTime": 1456821000000, 
     "key": 1456753141401, 
     "status": "pending" 
    } 
    } 
} 

qui ont des tâches planifiées. Les travaux peuvent être exécutés à tout moment, entre à partir de l'heure et toTime. Ma tâche est de vérifier toutes les heures s'il y a un travail en attente pour l'heure à venir. Signifie que quel que soit le deTime est mais toTime l'horodatage doit être supérieur à l'horodatage de 1 heure après l'heure actuelle. De même, nous devrions aller chercher si le deTime tombe également de l'horodatage actuel à l'heure suivante.

Je suis nouveau à couchbase. La vue que j'ai créé est

function(doc, meta){ 
    if(doc.docType && doc.docType=="scheduledJob"){ 
    for(var key in doc.jobs){ 
     var job = doc.jobs[key] 
     if(job.status == "pending") { 
    emit(job.fromTime+'_'+job.toTime, job); 
     } 
    } 

    } 

} 

J'envoie startkey = "currentTimestamp_0000000000000" et endkey = "0000000000000_currentTime + 1 heure-timestamp"

S'il vous plaît aidez-moi où je me trompe.

+0

Pouvez-vous clarifier? Voulez-vous dire que vous ne vous souciez pas vraiment du temps? ou fromTime devrait être plus grand que "maintenant"? –

Répondre

1

La combinaison startkey/endkey que vous donnez dans tous les cas non-triviaux donne un résultat vide. Imaginez (pour la simplicité raccourci à 2 chiffres), le temps courant à 18, et l'heure à être 19. Puis vos cordes sont:

startkey 18_00 
endkey 00_19 

lexicographique, le startkey est plus grande que la endkey, de sorte que l'intervalle est vide.

La manière la plus simple me semble de créer deux vues séparées, l'une émettant juste le fromTime, l'autre le toTime. Si je comprends bien les exigences, vous devez rechercher tous les travaux ayant FromTime entre maintenant et maintenant + 1 hr, même chose pour toTime, et effectuer une union d'ensemble programmatique des deux résultats.

Il peut être encore plus simple d'utiliser une seule vue, et, pour chaque objet scheduledJob, 2 émettent, l'un des fromTime, un autre pour toTime. Mais je n'ai jamais essayé de faire plus d'une émission sur un document, donc vous devriez essayer si cela fonctionne.

Votre façon de convertir les valeurs numériques en une chaîne semble plutôt sujette aux erreurs. Si une clé composée est nécessaire, je préférerais une clé composée de couchbase appropriée, qui est obtenue par ex. emit([job.fromTime, job.toTime], job). Mais je ne vois pas une solution facile à votre problème en utilisant ce genre de clé.

+0

Cette réponse est bonne et typique. condider dans ce cas utiliser une clé (fromTime ou toTime) pour obtenir le résultat puis filtrer l'autre vaut mieux que l'union avec deux résultats: 1. emit (fromTime, toTime) utilise fromTime range, 2. filtre le résultat de 1 avec toTime. et un autre programme de mise à jour doit changer status = pending en une autre valeur. –