2014-01-07 28 views
1

我有一個表~8000 quiz questions。 他們分爲25 categories。 每個類別都有一個屬性max_questions,它告訴我有多少個問題需要我選擇randomly來生成測驗。RethinkDB:​​獲取每個類別的隨機文檔

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

如果您在一個查詢中完成所有操作,而不是向數據庫發出多個請求,速度會更快。下面是或多或少相當於你寫一個查詢:

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

通知我綁定的表來這裏變量,這樣categories勢必r.table("categories")

+0

這正是我想要的。它現在執行530ms。非常感謝! –

+0

另外,如果你想讓這個更快,你可以創建一個索引category_id字段。 –

+0

我將.filter({category_id:cat('id')})方法更改爲.getAll(cat('id'),{index:'category_id'})並獲得了大量性能改進。用rethinkdb 1.12.1 filter()花費~1.2秒,getAll()只花費〜150ms。任何想法爲什麼? –