2015-06-28 23 views
5

Sto avviando un progetto utilizzando Cloudant. È un sistema semplice per la registrazione, quindi posso monitorare l'utilizzo delle mie app.Seleziona numero distinto cloudant/couchdb

miei documenti assomiglia a questo:

{
app: 'nome dell'app',
tipo: 'visualizzazione della pagina | login | ecc. ',
proprietario:' email_of_the_user ',
dispositivo:' iphone | android | ecc .. ',
Data: 'aaaa-mm-dd'
}

ho provato a fare un po' mappa riduzione e ricerche sfaccettati, ma non ho trovato finora il risultato per quello che voglio.

Desidero contare il numero di documenti distinti raggruppati dallo stesso proprietario, data (aaaa-mm-gg) e app.

[Ad esempio, se uno stesso utente accede all'app due volte o 20 volte nella stessa data, verrà conteggiata una sola volta. Voglio contare quanti singoli utenti hanno utilizzato un'app ogni giorno, indipendentemente dal tipo di registro o dal dispositivo utilizzato.]

Se si trattava di SQL, presupponendo che ogni chiave del documento sia una colonna , vorrei interrogare qualcosa di simile:

SELEZIONA app, la data, COUNT (*) FROM gruppo REGISTRI per data, il proprietario, app

formica il risultato sarebbe qualcosa di simile:

'App1', "2015-06-01", 200
"App1", "2015-06-02", 232
'App2', '2015/06/01', 142
'App2', '2015/06/02', 120

Come posso ottenere lo stesso risultato utilizzando Cloudant/CouchDB?

risposta

0

Siamo stati in grado di fare questo nel nostro progetto utilizzando l'API Java Cloudant ...

https://github.com/cloudant/java-cloudant

Si dovrebbe essere in grado di ottenere questo tipo di risultato con la creazione di una vista che ha una funzione di mappa come questo ...

function(doc) { 
    emit([doc.app, doc.date, doc.owner], 1); 
} 

La funzione di riduzione dovrebbe essere simile a questo:

function(keys, values, rereduce){ 
    if (rereduce){ 
     return sum(values); 
    } else { 
     return sum(values); 
    } 
} 

Quindi abbiamo utilizzato la seguente query per ottenere i dati desiderati.

Database db = .... 
db.view(viewName).startKey(startKeys).endKey(endKeys) 
      .group(true).includeDocs(false).query(castClass) 

abbiamo fornito il nome della vista e alcuni tasti di inizio e fine (da quando abbiamo emesso una chiave composta e abbiamo bisogno di fornire un filtro) e poi utilizzato il metodo di gruppo per ottenere i dati indietro come avete bisogno.

Revised ..

Con questa nuova chiave emettono nella funzione mappa si dovrebbe ottenere risultati come questo:

{[ 
{[app1, 2015,06,28, [email protected]], 12}, <- john visited 12 times  on that day... 
{[app1, 2015,06,29, [email protected]], 10}, 
{[app1, 2015,06,28, [email protected]], 1} 
]} 

Se si utilizza buone inizio e di fine le chiavi, la quantità di record che sei l'interrogazione rimarrà piccola e il numero di record che ricevi è quello dei visitatori unici che stai cercando. Nota che in questo scenario stai tornando un po 'più di quello che vuoi, ma funziona.

+0

Ho provato questo. Il problema è che i duplicati vengono contati. snapit [email protected] login iphone 2015-06-29 snapit [email protected] foto iphone 2015-06-29 snapit [email protected] login iphone 2015-06-29 snapit [email protected] accesso iphone 2015-06-30 snapit [email protected] login android 2015-06-29 snapit [email protected] login android 2015-06-30 snapit [email protected] login android 2015-06-30 Questo dovrebbe restituire 2015-06-29 - 2 (due registri singoli per ciascun utente in quel giorno) 2015-06-30 - 3 (tre ..) Ma sto ricevendo: 2015-06-29 -4 2015-06-30 - 3 –

+0

Hai provato ad aggiungere più campi alla chiave emessa, questo aiuta con la rimozione di duplicati ... ad esempio prova questo –

1

È possibile farlo utilizzando documenti di progettazione, come citato Cesar. Un esempio concreto sarebbe quello di creare una visione in cui la funzione mappa emette il campo su cui si desidera gruppo su, come ad esempio:

function(doc) { 
    emit(doc.email, 1); 
} 

Poi, si seleziona il desiderato ridurre la funzione (come ad esempio _count). Quando visualizzi questo sul dashboard Cloudant, assicurati di selezionare Riduci come parte delle opzioni di query. Quando si accede alla vista tramite URL è necessario passare i parametri appropriati (reduce=true&group=true).

La documentazione relativa Visualizzazioni qui è abbastanza approfondita: https://docs.cloudant.com/creating_views.html