2014-10-03 1 views
0

Я пишу приложение 2.3.2 для игры. В моем приложении я использую базу данных MongoDB. У меня есть рекомендация.tags и collections.request коллекции. Они имеют следующий формат JSON: 1) recommendation.tags:Ошибка при запросе счетчика на mongodb с использованием reactivemongo

{ 
    "_id" : ObjectId("542e65fb7ab45a4189944137"), 
    "tag" : "Meat:Pork - Bacon Cooked Slcd" 
} 

2) recommendation.requests

{ 
    "_id" : ObjectId("542e67e07f724fc2af28ba74"), 
    "id" : "6649fd2b-c616-4693-aec5-a2a2a1658417", 
    "user" : { 
     "id" : "", 
     "email" : "[email protected]" 
    }, 
    "tags" : [ 
     { 
      "tag" : "Fish:Swordfish Loin Portions" 
     }, 
     { 
      "tag" : "Vegetable:Carrots - Jumbo" 
     } 
    ], 
    "date" : 1412327392380 
} 

Я пишу контроллер для обработки все запроса статистики. В этом случае я пишу метод, который ищет наиболее используемый тег в системе. Для этого я использую реактивный монго-драйвер для scala. Это код используется:

/** 
    * Method that search the most used tag. 
    */ 
    def max = Action { 
    var max = 0 
    var tag = null 
    val tags: Future[List[Tag]] = Tags.find(Json.obj()).toList 
    for{ 
    tag <- tags 
    tagsOk <- Requests.find(Json.obj("tags.tag" -> tag.category + " " + tag.name)).count 
    if(tagsOk > max) { 
     max = tagsOk 
     tag = tag.category + " " + tag.name //string tag 
    } 
    } 
    Ok(tag) 
} 

Но компилятор дает мне следующие ошибки:

[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/controllers/manager/StatisticsController.scala:28: identifier expected but string literal found. 
[error]  tagsOk <- Requests.find(Json.obj("tag" : tag.category + " " + tag.name)).count 
[error]               ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/controllers/manager/StatisticsController.scala:33: ')' expected but '}' found. 
[error] } 
[error] ^
[error] two errors found 
[error] (compile:compile) Compilation failed 

Что случилось ??

@edit

[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/controllers/manager/StatisticsController.scala:28: value category is not a member of List[recommendationsystem.models.Tag] 
[error]   tagsOk <- Requests.find(Json.obj("tags.tag" -> tag.category + " " + tag.name)).count 
[error]    

@newedit

Я решил, используя этот код:

val tags = for{ 
     tags <- futureTags 
     } 
     for(document <- tags) { 
     val tagsOk = Requests.find(Json.obj("tags.tag" -> document.category)) 

     } 

Есть ли способ, чтобы получить список [T] и после итерации по нему в том же для ???

+0

делает 'Json.obj ("tags.tag": tag.category + "" + tag.name)' не должно быть decalred так: 'Json.obj (» tags.tag "-> tag.category +": "+ tag.name)'? –

+0

Да, но компилятор продолжает давать мне ошибки, см. Мой @edit –

+1

«Теги» - это «Будущее со списком», тогда «тег <- теги» дает вам список в будущем (Future is also Collection), используйте 'tag < - tags.flatMap' вместо –

ответ

0

решаемые с помощью

def max = Action { 
    var max: Int = 0 
    var tagFound: Tag = null 
    //obtain all the tags in the db. 
    val futureTags: Future[List[Tag]] = Tags.all.toList 
    futureTags map{ (tags: List[Tag]) => 
         tags map { 
          (tag: Tag) => 
          //create the tag String 
          val tagName = tag.category + ":" + tag.attr 
          //search the documents where tags.tag == tag in the db. 
          val futureRequests : Future[List[recommendationsystem.models.Request]]= Requests.find(Json.obj("tags.tag" -> tagName)).toList 
          futureRequests map { (requests: List[recommendationsystem.models.Request]) => 
                //get the numbers of documents matching the tag 
                val number = requests.size 
                if(number > max) { 
                 max = number 
                 tagFound = tag 
                } 

          } 

         } 
    }