2014-01-31 70 views
1

我有一個表creations。每個屬於一個類別(與categoryId)。他們也有一個叫statFavorites的字段。查詢最受歡迎的每個類別

我想返回列表中每個類別的收藏夾最多的單個創建的平面列表。

我能想到的唯一方法就是用groupedMapReduce。有另一種方法嗎?

var categories; // objects with an id 

r.table('creations') 
.filter(function(creation) { 
    return categories.filter(function(category) { 
     return category.id == creation.categoryId 
    }).length > 0 
}) 
.groupedMapReduce(function(row) { 
    return row("categoryId") 
} 
, function(row) { return row } 
, function(best, creation) { 
    return r.branch(creation("statFavorites").gt(best("statFavorites")), creation, best 
}) 

兩件事情上面發生的事情:首先,我過濾的創作只匹配我關心的類別(以蒙戈的in查詢相當於如何做到這一點的反思。?)

二,我得到了每個人最喜歡的。

有沒有更好的方法來做到這一點?當我寫數據時,預先計算事物也可以。

回答

1

你可以做這樣的事情: 的in等效爲contains http://www.rethinkdb.com/api/javascript/contains/

categories = [id1, id2, id3] 

r.table('creations') 
.filter(function(creation) { 
    return r.expr(categories).contains(creation("id")) 
}) 
.groupedMapReduce(function(row) { 
    return row("categoryId") 
} 
, function(row) { return row } 
, function(best, creation) { 
    return r.branch(creation("statFavorites").gt(best("statFavorites")), creation, best 
}) 

如果類是像

{ 
    id1: true, 
    id2: true 
} 

的對象也可以使用hasFields,而不是contains http://www.rethinkdb.com/api/javascript/has_fields/

r.table('creations') 
.filter(function(creation) { 
    return r.expr(categories).hasFields(creation("id")) 
}) 
.groupedMapReduce(function(row) { 
    return row("categoryId") 
} 
, function(row) { return row } 
, function(best, creation) { 
    return r.branch(creation("statFavorites").gt(best("statFavorites")), creation, best 
})