2014-11-06 94 views
1

我在Couchbase的一些文件與下面的模板:Couchbase定製減少功能

{ 
    "id": 102750, 
    "status": 5, 
    "updatedAt": "2014-09-10T10:50:39.297Z", 
    "points1": 1, 
    "points2": -3, 
    "user1": { 
     "id": 26522, 
     ... 
    }, 
    "user2": { 
     "id": 38383, 
     ... 
    }, 
    .... 
} 

我想要做的是組用戶的文件,總結了點,每個用戶再展上週有100名用戶。我一直在盤旋,但我沒有任何解決方案。

我已經開始用下面的地圖功能:

function (doc, meta) { 
    if (doc.user1 && doc.user2) { 
    emit(doc.user1.id, doc.points1); 
    emit(doc.user2.id, doc.points2); 
    } 
} 

,然後試圖減少結果的總和,但顯然我錯了,因爲我沒能進行排序上的點,但是我做不到還包括日期參數

+0

看看http://blog.couchbase.com/using-map - 和 - 減少 - 視圖 - 排名 - 這應該是非常相似的,你想實現的。 – DaveR 2014-11-06 15:40:41

+0

Thanx @DaveRigby您的回覆,但您提供的鏈接介紹瞭如何查找指定用戶的排名。我需要的是在特定時間段內瞭解前100名用戶 – Sami 2014-11-07 14:11:30

回答

0

。 我所做的是我改變了我的地圖功能是這樣的:

function (doc, meta) { 
    if (doc.user1 && doc.user2) { 
    emit(dateToArray(doc.createdAt), { 'userId': doc.user1.id, 'points': doc.points1}); 
    emit(dateToArray(doc.createdAt), { 'userId': doc.user2.id, 'points': doc.points2}); 
    } 
} 

而在腳本中,我與查詢所需參數的視圖,然後我分組和排序,然後將其發送的前100名用戶。

我使用節點JS所以我的劇本是這樣的:(結果是什麼,我從couchbase視圖讀)

function filterResults(results) { 
    debug('filtering ' + results.length + ' entries..'); 
    // get the values 
    var values = _.pluck(results, 'value'); 
    var groupedUsers = {}; 

    // grouping users and sum their points in the games 
    // groupedUsers will be like the follwoing: 
    // { 
    //  '443322': 33, 
    //  '667788': 55, 
    //  ... 
    // } 
    for (var val in values) { 
    var userId = values[val].userId; 
    var points = values[val].points; 
    if (_.has(groupedUsers, userId)) { 
     groupedUsers[userId] += points; 
    } 
    else 
     groupedUsers[userId] = points; 
    } 

    // changing the groupedUsers to array form so it can be sorted by points: 
    // [['443322', 33], ['667788', 55], ...] 
    var topUsers = _.pairs(groupedUsers); 

    // sort descending 
    topUsers.sort(function(a, b) { 
    return b[1] - a[1]; 
    }); 

    debug('Number of users: ' + topUsers.length + '. Returning top 100 users'); 
    return _.first(topUsers, 100); 
}