2017-10-02 2 views
0

Je voudrais compter le nombre de documents créés en 24h en utilisant le processus Map Reduce de la base de données IBM Cloudant. Voici mon code de la carte-Reduce:Requête Nuage le nombre de documents créés en 24h en utilisant Map Reduce.

function (doc) { 
    docTime = (new Date(doc.created_at)).getTime(); 
    currentTime = (new Date()).getTime(); 
    if ((86400000 - (currentTime - docTime)) > 0) { 
      emit(doc.deviceID, 1); 
    } 
} 

Dans la phase réduire, je la fonction de comptage pour obtenir le total des documents. Cependant, la valeur currentTime vu pour être prise la première fois la construction de la réduction de la carte et non mis à jour pour chaque requête.

Ce serait génial si vous recevez des suggestions pour résoudre ce problème.

Merci beaucoup.

+0

J'ai eu un problème similaire ... J'ai simplement ajouté du temps au document JSON que j'enregistrais dans le cloud. Puis créé une vue basée sur elle. –

Répondre

2

Je pense que vous avez quelques options ici, mais je ne pense pas qu'une vue est l'un d'entre eux. Je crois que les vues ne sont calculées qu'au moment de l'insertion/mise à jour.

Votre première option consiste à utiliser Cloudant Query. Vous pouvez créer un index sur votre champ created_at et utilisez le sélecteur suivant:

"selector": { 
    "$and": [ 
     {"created_at" : { "$gt": 1506874127 }}, 
     {"created_at": { "$lt": 1506960651 }} 
    ] 
} 

Le problème avec ceci est que vous devrez parcourir en boucle et compter toutes les entrées. Une route alternative serait d'utiliser Cloudant Search. Créer un index de recherche dans Cloudant similaire à ce qui suit:

{ 
    "_id": "_design/allDocs", 
    "views": {}, 
    "language": "javascript", 
    "indexes": { 
    "byCreatedAt": { 
     "analyzer": "standard", 
     "index": "function (doc) {\n if (doc.created_at && doc.device_id) {\n index(\"created_at\", doc.created_at);\n index(\"device_id\", doc.device_id);\n }\n}" 
    } 
    } 
} 

Cela correspond à ce qui suit lors de l'utilisation du tableau de bord Cloudant:

conception doc = allDocs

nom d'index = byCreatedAt

index fonction =

function (doc) { 
    if (doc.created_at && doc.device_id) { 
    index("created_at", doc.created_at); 
    index("device_id", doc.device_id); 
    } 
} 

Ensuite, vous pouvez lancer une recherche en utilisant une plage - où la plage serait l'heure il y a 24 heures à l'heure actuelle - et spécifier group_field=device_id pour regrouper les résultats par ID de périphérique. Par exemple,

https://<YOUR_INSTANCE>.cloudant.com/<YOUR_DB>/_design/allDocs/_search/byCreatedAt?q=created_at%3A[1506874127%20TO%201506960651]&group_field=device_id&limit=1

Voici la requête de recherche est:

created_at:[1506874127 TO 1506960651]

J'utilise timestamp unix. Vous pouvez également utiliser des chaînes de date, je crois. J'ai également mis la limite à 1. Cela retournera seulement la première entrée dans chaque groupe puisque vous voulez seulement le compte total (la limite = 0 n'est pas permise pour des requêtes groupées). Voici un exemple de résultat:

{ 
    "total_rows":3, 
    "groups":[ 
    { 
     "by":"1", 
     "total_rows":2, 
     "rows":[ 
     { 
      "id":"263a81ea76528dead3a4185df3676f62", 
      "order":[ 
      1.0, 
      0 
      ], 
      "fields":{ 

      } 
     } 
     ] 
    }, 
    { 
     "by":"2", 
     "total_rows":1, 
     "rows":[ 
     { 
      "id":"d857ac5c58eebde4c21ffdcf3e0fd321", 
      "order":[ 
      1.0, 
      0 
      ], 
      "fields":{ 

      } 
     } 
     ] 
    } 
    ] 
} 

Le champ by est l'ID du périphérique.

+0

Merci beaucoup pour votre commentaire. En cas de comptage du nombre de documents pour chaque périphérique (identifié par deviceID dans le document) comme opération de regroupement, que dois-je configurer? Merci encore –

+0

Désolé, j'ai raté la partie regroupement de votre question. S'il vous plaît voir la réponse révisée. Remarque: l'index de recherche et la requête ont tous deux été modifiés. – markwatsonatx

+0

Un grand merci pour votre aide. En cas de regroupement par device_id de la recherche cloudant, Cloudant limite seulement 10 groupes par requête. Cela signifie que notre base de données contient 100 appareils. Cela sera impossible ou conduira à une nouvelle requête de boucle. Avez-vous des suggestions à ce sujet? Merci beaucoup pour votre aide –