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
})

上面发生了两件事:首先,我正在过滤创作以仅匹配我关心的类别(相当于inmongo 中的查询。如何在重新思考中做到这一点?)

其次,我得到了每个人中最喜欢的。

有没有更好的方法来做到这一点?在我写数据的时候预先计算也可以。

4

1 回答 1

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
}

您也可以使用http://www.rethinkdb.com/api/javascript/has_fields/hasFields代替contains

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
})
于 2014-01-31T17:14:36.313 回答