У меня есть приложение Play Framework, использующее ReactiveMongo с MongoDB, и у меня есть следующий код:
def categories(id: String): Future[Vector[Category]] = {...}
....
val categoriesFuture = categories(id)
for {
categories: Vector[Category] <- categoriesFuture
categoryIdsWithoutPerson: Vector[BSONObjectID] <- findCategoryIdsWithoutPerson(categories.map(_.id), personId) //Returns Future[Vector[BSONObjectID]]
categoriesWithoutPerson: Vector[Category] <- categories.filter(category => categoryIdsWithoutPerson.contains(category.id)) //Play cites the error here
} yield categoryIdsWithoutPerson
Чтобы объяснить этот код, я получаю Vector
из Categories
, завернутых в Future
, потому что так работает ReactiveMongo. В понимании for
я использую этот Vector
, чтобы затем получить список идентификаторов из базы данных. Наконец, я использую вызов filter
, чтобы сохранить только те категории, идентификаторы которых можно найти в этом списке идентификаторов.
Все кажется довольно простым. Проблема в том, что Play выдает следующую ошибку компиляции в последней строке понимания for
:
pattern type is incompatible with expected type;
found : Vector[com.myapp.Category]
required: com.myapp.Category
Я не уверен, почему требуемый тип является единственным экземпляром Category
.
Я мог бы использовать некоторое понимание того, что я делаю неправильно, и / или есть ли более простой или более идиоматический способ выполнить это.