1

我有一张桌子~8000 quiz questions。它们分为25 categories. 每个类别都有一个属性max_questions,它告诉我必须选择多少问题randomly才能生成测验。

例如

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()对我来说听起来并不好。

我真的很感谢你的帮助!

4

1 回答 1

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").

于 2014-01-07T19:54:56.617 回答