2015-06-28 28 views
5

Tôi đang bắt đầu một dự án bằng Cloudant. Đó là một hệ thống đăng nhập đơn giản, vì vậy tôi có thể theo dõi việc sử dụng các ứng dụng của mình.Chọn số lượng mây khác nhau/couchdb

tài liệu của tôi trông như thế này:

{
ứng dụng: 'tên của ứng dụng',
loại: 'xem trang | đăng nhập | v.v. ',
chủ sở hữu:' email_of_the_user ',
thiết bị:' iphone | android | vv .. ',
date: 'yyyy-mm-dd'
}

Tôi đã cố gắng để làm một số bản đồ và tìm kiếm giảm sắc cạnh, nhưng không thể tìm thấy cho đến nay kết quả cho những gì tôi muốn.

Tôi muốn đếm số tài liệu riêng biệt được nhóm theo cùng một chủ sở hữu, ngày (yyyy-mm-dd) và ứng dụng.

[Ví dụ: nếu một người cùng đăng nhập vào ứng dụng hai lần hoặc 20 lần trong cùng một ngày, nó sẽ chỉ được tính một lần. Tôi muốn đếm số lượng người dùng đã sử dụng ứng dụng mỗi ngày, bất kể loại nhật ký là gì hoặc thiết bị mà anh ấy đã sử dụng.]

Nếu đó là SQL, giả sử mỗi khóa của tài liệu là một cột , tôi sẽ truy vấn một cái gì đó như thế này:

CHỌN ứng dụng, cập nhật, count (*) TỪ nhóm bản ghi theo ngày, chủ sở hữu, ứng dụng

kiến ​​kết quả sẽ là một cái gì đó như:

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

Làm thế nào tôi có thể nhận được kết quả tương tự sử dụng Cloudant/CouchDB?

Trả lời

0

Chúng tôi đã có thể làm điều này trong dự án của chúng tôi bằng cách sử dụng API Cloudant Java ...

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

Bạn sẽ có thể để có được loại này kết quả bằng cách tạo ra một cái nhìn có chức năng bản đồ như thế này ...

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

Chức năng giảm sẽ giống như sau:

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

Sau đó, chúng tôi đã sử dụng truy vấn sau để lấy dữ liệu chúng tôi muốn.

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

Chúng tôi cung cấp các tên xem và một số đầu và cuối khóa (kể từ khi chúng phát ra một chìa khóa hợp chất và chúng tôi cần phải cung cấp một bộ lọc) và sau đó sử dụng phương pháp nhóm để có được những dữ liệu trở lại khi bạn cần nó.

Revised ..

Với phím này Emit mới trong chức năng bản đồ bạn sẽ nhận được kết quả như thế này:

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

Nếu bạn sử dụng tốt đầu và cuối khóa, số lượng hồ sơ bạn truy vấn sẽ vẫn nhỏ và số lượng hồ sơ bạn nhận được là số lượng khách truy cập duy nhất bạn đang tìm kiếm. Lưu ý rằng trong trường hợp này bạn đang nhận được nhiều hơn một chút so với bạn muốn, nhưng nó hoạt động.

+0

Tôi đã thử điều này. Vấn đề là các bản sao đang được tính. snapit [email protected] login iphone 2015-06-29 snapit [email protected] ảnh iphone 2015-06-29 snapit [email protected] login iphone 2015-06-29 snapit [email protected] login iphone 2015-06-30 snapit [email protected] đăng nhập android 2015-06-29 snapit [email protected] đăng nhập android 2015-06-30 snapit [email protected] login android 2015-06-30 Điều này nên trả lại 2015-06-29 - 2 (hai nhật ký duy nhất cho mỗi người dùng trong ngày đó) 2015-06-30 - 3 (ba ..) Nhưng tôi nhận được: 2015-06-29 -4 2015-06-30 - 3 –

+0

Bạn đã thử thêm nhiều trường vào khóa đang được phát, điều này sẽ giúp với việc loại bỏ các bản sao ... ví dụ, hãy thử điều này –

1

Bạn có thể thực hiện việc này bằng tài liệu thiết kế, như Cesar đã đề cập. Một ví dụ cụ thể sẽ tạo ra một cái nhìn mà chức năng bản đồ của bạn phát ra lĩnh vực vào nơi bạn muốn vào nhóm trên, chẳng hạn như:

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

Sau đó, bạn chọn mong muốn làm giảm chức năng (như _count) của bạn. Khi xem trang này trên trang tổng quan Cloudant, hãy đảm bảo bạn chọn Giảm làm một phần của tùy chọn truy vấn. Khi truy cập chế độ xem qua URL, bạn cần phải chuyển các thông số thích hợp (reduce=true&group=true).

Tài liệu về Chế độ xem ở đây khá kỹ lưỡng: https://docs.cloudant.com/creating_views.html

Các vấn đề liên quan