2

У меня есть приложение 2.1, которое использует MongoDB через Reactivemongo 0.8 plugin. В моем приложении я использую описанный Подход here без использования моделейPlay 2.1 и reactivemongo 0,8 счет документов

У меня есть метод, который возвращает все документы из MongoDB, где «тип» равен параметр GetType в функции getTypeAll, например {"type": "computer"}, который работает отлично.

def getTypeAll(getType: String) = Action { 

val validatedType = getType.replaceAll("-"," ") 
val q = QueryBuilder().query(toType.writes(validatedType)) 

Async { 

val f = collection.find[JsValue](q) 

f.toList.map{ 

    jsonp => 


    Ok(Json.toJson(jsonp)) 

    } 
    } 
} 

toType записывается как val toType = OWrites[String]{ s => Json.obj("type" -> s) } и сбор вал определяется как lazy val collection = db("mycollection")

Проблема заключается в том, что я не в состоянии написать метод, который получит количество документов, где «тип» равно один и тот же параметр.

def countTypeAll(getType: String) = Action { 

} 

и возвращает его как JSON, как { "typecount": 45}

Я смотрел на каждом примере я нашел, но без успеха. Я думаю, что я хочу что-то вроде val c = collection.find[JsValue](q).count()

, но он дает ошибку говоря value size is not a member of reactivemongo.api.DefaultCollection

Может кто-нибудь сказать мне, как сосчитать все документы, в которых значение элемента равна указанному значению?

ответ

5

С помощью ReactiveMongo 0.8 для этого вы должны использовать команду Count.

val futureCount = db.command(Count(collection.name, Some(BSONDocument("type" -> BSONString(s))))) 
futureCount.map { count => // count is an Int 
    // do some stuff 
} 

Невозможно передать его непосредственно документу JSON. Но вы можете явно преобразовать свой документ JSON в BSONDocument, если вы не хотите самостоятельно писать BSONDocument.

Смежные вопросы