2015-06-28 34 views
5

Cloudant kullanarak bir proje başlatıyorum. Günlüğe kaydetme için basit bir sistemdir, bu yüzden uygulamalarımın kullanımını takip edebilirim. Farklı sayım seçin cloudant/couchdb

My belgeler

şöyle görünür:

{
app: 'Uygulamanın adı'
türü: "Sayfa görüntüleme | giriş | etc .. ',
sahibi:' email_of_the_user ',
aygıt:' iphone | android | vs .. ',
tarih: 'yyyy-aa-gg' Bazı azaltarak harita ve yönlü aramaları yapmaya çalıştık, ama şimdiye kadar ne istiyorum sonucunu bulamadık


}.

Aynı sahibin, tarihin (yyyy-aa-gg) ve uygulamaya göre gruplandırılmış farklı belgelerin sayısını saymak istiyorum.

[Örneğin, aynı kullanıcı aynı günde iki kez veya 20 kez oturum açarsa, yalnızca bir kez sayılır. Günlüğün türü veya kullandığı aygıt ne olursa olsun her gün bir uygulamada kaç tane kullanıcı kullandığını görmek istiyorum.]

Belgenin her bir anahtarının bir sütun olduğunu varsayarak SQL ise Uygulamanın, tarih, sahibi tarafından GÜNLÜKLERİ grubunda GELEN (*) saymak,

SEÇ uygulaması, tarih

karınca sonuç gibi bir şey olurdu: Ben böyle bir şey sorgulamak istiyorum

'Uyg1', '2015-06-01', 200
'App1', '2015-06-02', 232
'Uyg2', '2015/06/01', 142
'Uyg2', '2015/06/02', 120

Ben Cloudant/CouchDB kullanarak aynı sonucu elde edebilirsiniz nasıl

?

cevap

0

Selamlar ...

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

Bir görünüm oluşturarak bu tip bir sonucu elde etmek mümkün olmalıdır

: o

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

şöyle görünmelidir fonksiyonunu azaltmak ... böyle bir harita işlevi vardır

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

Ardından, istediğimiz verileri almak için aşağıdaki sorguyu kullandık.

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

Biz (biz bir bileşik anahtarı yayılan ve bir filtreyi tedarik etmek gerekli beri) görünüm adını ve bazı başlangıç ​​ve bitiş anahtarlarını sağlanan ve daha sonra ihtiyaç duyduğunuzda geri veri almak için grup yöntemi kullanılmıştır.

Revize .. haritası fonksiyonunda bu yeni yayarlar tuşu almalısınız ile

böyle sonuçları:

{[ 
{[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} 
]} 

iyi başlangıç ​​ve bitiş tuşlarını kullanırsanız, konum kayıtlarının miktarı sorgulama küçük kalacaktır ve geri aldığınız kayıtların sayısı, aradığınız benzersiz ziyaretçilerdir. Bu senaryoda, istediğinizden biraz daha fazla geri dönüyorsunuz, ama işe yarıyor.

+0

:

burada Views'daki dokümantasyon oldukça titiz. Sorun, kopyaların sayılmasıdır. snapit [email protected] giriş iphone 2015-06-29 snapit [email protected] photo iphone 2015-06-29 snapit [email protected] giriş iphone 2015-06-29 snapit [email protected] login iphone 2015-06-30 snapit [email protected] giriş android 2015-06-29 snapit [email protected] giriş android 2015-06-30 snapit [email protected] giriş android 2015-06-30 2015-06-29 - 2 (o gün içindeki her kullanıcı için iki adet tek kayıt) dönmelidir 2015-06-30 - 3 (üç ..) Ama şunu elde ediyorum: 2015-06-29 -4 2015-06-30 - 3 –

+0

Yayımlanan tuşa daha fazla alan eklemeyi denediniz mi? çiftleri kaldırarak ... örneğin şunu deneyin –

1

Bunu, Cesar'ın belirttiği gibi tasarım belgelerini kullanarak yapabilirsiniz. Bir somut örnek, harita işlevi gibi üzerinde gruplandırmak istediğiniz yere alanını yayan bir görünüm oluşturmak olacaktır:

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

Sonra seçmek sizin (örneğin _count gibi) fonksiyonunu azaltmak arzu. Bunu Cloudant panosunda görüntülerken, sorgu seçeneklerinin bir parçası olarak Reduce'u seçtiğinizden emin olun. Görünümü URL yoluyla erişirken, uygun parametreleri (reduce=true&group=true) iletmeniz gerekir. Bu denedim https://docs.cloudant.com/creating_views.html