0

I've found this example... but it shows how to select one document from a collection randomly, while I need to select more than one document and as efficiently as possible.

j3d
  • 9,492
  • 22
  • 88
  • 172

1 Answers1

1

Here below is my solution:

def listRandom(selector: JsValue, resNum: Int): Future[List[User]] = {    
  userService.count(selector).flatMap {
    case n if n > 0 =>
      val perPage = resNum * 10
      val randomPage = Random.nextInt(math.max(1, n / perPage))
      context.find(selector, None, None, randomPage, perPage).map { users =>
        Random.shuffle(users) take resNum
      }
   case _ => Future.successful(Seq.empty[User])
  }
}

listRandom takes a selector and an Int that specifies how many results should be returned.

First it determines how many documents the collection actually contains; then it multiplies resNum by 10 (this is the page size) and determines the number of pages. Finally, it selects one page randomly and shuffles the result.

I hope it helps.

j3d
  • 9,492
  • 22
  • 88
  • 172