2017-03-03 1 views
1

Je suis un contributeur à http://airpollution.online/ qui est Open Source environnement open source ayant IBM Cloudant comme son service de base de données.Requête agrégée pour IBM Cloudant qui est fondamentalement couchDB

L'architecture de la plateforme est telle que nous devons aller chercher les dernières données de chaque dispositif de mesure de la pollution de l'air d'une collection. En ce qui concerne mon expérience avec MongoDB, j'ai écrit une requête agrégée pour récupérer les dernières données de chaque appareil selon la clé de temps dans chaque document disponible dans la collection respective.

requête globale échantillon est:

db.collection("hourly_analysis").aggregate([ 
{ 
    $sort: { 
     "time": -1, 
     "Id": -1 
    } 
}, { 
    $project: { 
     "Id": 1, 
     "data": 1, 
     "_id": 0 
    } 
}, { 
    $group: { 
     "_id": "$Id", 
     "data": { 
      "$last": "$$ROOT" 
     } 
    } 
} 

Si quelqu'un a idée/suggestions sur comment puis-je écrire des documents de conception dans IBM Cloudant, S'il vous plaît aidez-moi! Merci! P.S. Nous devons encore faire le backend open source pour ce projet. (peut prendre un certain temps)

+0

Pouvez-vous donner un aperçu général de ce que vous essayez de faire? À quoi ressemblent les données et à quelle question devez-vous répondre à partir de ces données? Je ne suis pas sûr de cet exemple de MongoDB ce que vous avez dans CouchDB et ce que vous cherchez à récupérer. –

+0

Bonjour @LornaMitchell, ce que j'essaie de faire, c'est qu'il y a des Go de données provenant de différents appareils. donc je dois choisir les dernières données de chaque appareil. chaque document a "deviceId" et "time" dans le temps. à titre d'exemple, vous pouvez essayer cette api ouverte qui donne les dernières données de https://openenvironment.p.mashape.com/all/public/devices utiliser l'en-tête "X-Mashape-Key": "AznHXmVhecmsh2eRvaAX42EKCmj3p1lRLpzjsnks0zMETqI4Mg" – jimish

Répondre

2

Dans CouchDB/Cloudant, il est généralement préférable d'utiliser une vue plutôt qu'une requête ad-hoc. C'est un problème mais essayez ceci: - une étape de carte qui émet l'ID de périphérique et l'horodatage comme deux parties d'une clé composite, plus le périphérique lisant comme valeur - une étape de réduction qui recherche l'horodatage le plus grand et renvoie l'horodatage le plus grand (le plus récent) et la lecture qui l'accompagne (les deux valeurs sont nécessaires parce que lors de la réduction, nous devons connaître l'horodatage pour pouvoir les comparer) - la vue avec le niveau groupe défini sur 1 vous donnera le plus récent lire pour chaque appareil.

Dans la plupart des cas dans Cloudant, vous pouvez utiliser les fonctions de réduction intégrées, mais vous souhaitez ici une fonction de touche.

(La façon dont j'ai résolu ce problème auparavant consistait à copier les données entrantes dans un magasin de "nouvelles lectures" et à les écrire dans une base de données de façon normale. la plus récente lecture.)

+0

cela a aidé. merci @Lorna – jimish