我有一张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
查询。如何重新思考?)
其次,每个人都受到最多的青睐。
有更好的方法吗?在我写数据时预先计算东西也可以。
答案 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
})