Frage

I have a collection in the database that looks like below:

Question
    {
        "_id" : ObjectId("52b3248a43fa7cd2bc4a2d6f"),
        "id" : 1001,
        "text" : "Which is a valid java access modifier?",
        "questype" : "RADIO_BUTTON",
        "issourcecode" : true,
        "sourcecodename" : "sampleques",
        "examId" : 1000,
        "answers" : [ 
            {
                "id" : 1,
                "text" : "private",
                "isCorrectAnswer" : true
            }, 
            {
                "id" : 2,
                "text" : "personal",
                "isCorrectAnswer" : false
            }, 
            {
                "id" : 3,
                "text" : "protect",
                "isCorrectAnswer" : false
            }, 
            {
                "id" : 4,
                "text" : "publicize",
                "isCorrectAnswer" : false
            }
        ]
    }

I have a case class that represents both the Question and Answer. The Question case class has a List of Answer objects. I tried converting the result of the find operation to convert the DBObject to my Answer type:

  def toList[T](dbObj: DBObject, key: String): List[T] =
    (List[T]() ++ dbObject(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[T]}

The result of the above operation when I call it like

toList[Answer](dbObj, "answers") map {y => Answer(y.id,y.text, y.isCorrectAnswer)}

fails with the following exception:

com.mongodb.BasicDBObject cannot be cast to domain.content.Answer

Why should it fail? Is there a way to convert the DBObject to Answer type that I want?

War es hilfreich?

Lösung

You have to retrieve values from BasicDBObject, cast them and then populate the Answer class:

Answer class:

 case class Answer(id:Int,text:String,isCorrectAnswer:Boolean)

toList, I changed it to return List[Answer]

 def toList(dbObj: DBObject, key: String): List[Answer] = dbObj.get(key).asInstanceOf[BasicDBList].map { o=>
    Answer(
     o.asInstanceOf[BasicDBObject].as[Int]("id"),
     o.asInstanceOf[BasicDBObject].as[String]("text"),
     o.asInstanceOf[BasicDBObject].as[Boolean]("isCorrectAnswer")
    )
  }.toList
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top