查询每个类别中最受欢迎的人

时间:2014-01-31 15:12:13

标签: database rethinkdb

我有一张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
})

上面发生了两件事:第一,我正在过滤创作只匹配我关心的类别(相当于mongo中的in查询。如何重新思考?)

其次,每个人都受到最多的青睐。

有更好的方法吗?在我写数据时预先计算东西也可以。

1 个答案:

答案 0 :(得分: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
})