2013-09-25 5 views
2

Я пытаюсь реализовать агрегированный метод в ReactiveMongo, но я немного застрял.Перевести агрегированную функцию mongodb на ReactiveMongo и scala

У меня есть следующий набор данных:

{ 
    "_id" : ObjectId("522891aa40ef0b5d11cb9232"), 
    "created" : 1378390442167, 
    "origin" : 2, 
    "originIpAddress" : "", 
    "rating" : 3, 
    "remindersSent" : 1, 
    "status" : 4, 
    "text" : "", 
    "updated" : 1378563426223, 
    "userInfo" : { 
     "firstName" : "Person", 
     "lastName" : "Person", 
     "email" : "[email protected]", 
     "fbPublish" : false 
    }, 
    "venueInfo" : { 
     "isAgent" : false, 
     "name" : "Company", 
     "id" : 1234 
    } 
}, 
{ 
    "_id" : ObjectId("522891aa40ef0b5d11cb9233"), 
    "created" : 1378390442167, 
    "origin" : 2, 
    "originIpAddress" : "", 
    "rating" : 3, 
    "remindersSent" : 1, 
    "status" : 4, 
    "text" : "", 
    "updated" : 1378563426223, 
    "userInfo" : { 
     "firstName" : "Person2", 
     "lastName" : "Person2", 
     "email" : "[email protected]", 
     "fbPublish" : false 
    }, 
    "venueInfo" : { 
     "isAgent" : false, 
     "name" : "Company2", 
     "id" : 4321 
    } 
}, 
{ 
    "_id" : ObjectId("522891aa40ef0b5d11cb9234"), 
    "created" : 1378390442167, 
    "origin" : 2, 
    "originIpAddress" : "", 
    "rating" : 3, 
    "remindersSent" : 1, 
    "status" : 4, 
    "text" : "", 
    "updated" : 1378563426223, 
    "userInfo" : { 
     "firstName" : "Person3", 
     "lastName" : "Person3", 
     "email" : "[email protected]", 
     "fbPublish" : false 
    }, 
    "venueInfo" : { 
     "isAgent" : false, 
     "name" : "Company", 
     "id" : 1234 
    } 
} 

Следующая агрегатная функция:

db.reviews.aggregate(
    {$match:{status:{"$ne":1}}}, 
    {$group: { _id: "$venueInfo.id", total:{"$sum":1}}} 
) 

дает мне:

{ 
    "result" : [ 
     { 
      "_id" : 1234, 
      "total" : 2 
     }, 
     { 
      "_id" : 4321, 
      "total" : 1 
     } 
    ] 
} 

Я пытался реализовать это в ReactiveMongo:

def aggregate() = { 
    val command = Aggregate(collection.name, Seq(
     GroupField("venueInfo.id")("total" -> SumValue(1)), 
     Match(BSONDocument("status" -> 1)) 
    )) 
    val result = collection.db.command(command) 
     result.map { value => { 
     println(s"got value $value") 
     } 

    } 

И это дает мне:

got value Stream(BSONDocument(<non-empty>), ?) 

Как вы можете видеть, что я получаю поток обратно. Итак, мой вопрос: как мне обрабатывать этот поток правильно, чтобы я мог работать со значениями и показывать их позже в представлении?

+0

Я думаю, что матч в коде не является правильным, в выборочных данных нет строки со статусом = 1 Match (BSONDocument («статус» -> BSONDocument («$ п» -> 1))) является правильным, может быть, – barczajozsef

ответ

1

Если вы хотели бы получить все значения данного Stream вы можете вызвать toSeq или toList на нем:

import play.modules.reactivemongo.json.BSONFormats._ 
import SomeResult 

collection.db.command(command) map { result => 
    result.toSeq map (Json.toJson(_).as[SomeResult]) 
} 

что приводит к Future[Seq[SomeResult]], где SomeResult бы случай класса как следующее:

import play.api.libs.json.Json 

case class SomeResult(_id: Long, total: Int) 

object SomeResult { 
    implicit val someResultFormat = Json.format[SomeResult] 
} 
Смежные вопросы