RethinkDB:​​获取每个类别的随机文档

时间:2014-01-07 19:31:54

标签: database-performance rethinkdb

我有一张~8000 quiz questions的表格。 它们分为25 categories。 每个类别都有一个属性max_questions,告诉我有多少问题需要randomly来生成测验。

e.g

Category 1 -> 2 questions
Category 2 -> 3 questions
Category 3 -> 1 question

我提出了一个解决方案,但我需要大约2秒即可完成。

r.table('categories').pluck('id', 'max_questions').orderBy('id').run(conn, function(err, cursor) {
    if(err) return next(new Error(err.msg));

    cursor.toArray(function(err, categories) {
        if(err) return next(new Error(err.msg));

        async.concat(categories, function(category, callback) {
            r.table('questions').filter({category_id: category.id }).sample(category.max_questions).run(conn, callback);
        }, function(err, questions) {
            if(err) return next(new Error(err.msg));
            res.json(questions);
        });
    });
});

使用RethinkDB检索问题有更快捷的方法吗?一次测验发出25次请求并拨打25次.sample()对我来说听起来不太好。

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果您在一个查询中完成所有操作而不是向数据库发出多个请求,那么速度会快得多。这是一个或多或少等同于您所写内容的单个查询:

categories.map(function (doc) {
    return doc.merge(
        {"questions":
           questions
           .filter({category_id:doc("id")})
           .sample(doc("max_questions"))
           .coerceTo("ARRAY")})
})

注意我已将表绑定到变量,因此categories绑定到r.table("categories")