2014-01-31 3 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 
}) 

Две вещи происходят выше: во-первых, я фильтрации творения только соответствовать категории I небезразличны (эквивалентом 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 
}) 
Смежные вопросы