2016-07-20 12 views
0

Ich bin gerade neu zu lernen, Scala und die damit verbundenen Technologien. Ich bin auf das Problem, wo der LoadUser einen Datensatz zurückgeben sollte, aber es kommt leer.ReactiveMongo Abfrage zurück keine

Ich erhalte die folgende Fehlermeldung: java.util.NoSuchElementException: None.get

Ich schätze diese Scala ist nicht ideal, so können Sie mich Verbesserungen vorzuschlagen.

class MongoDataAccess extends Actor { 
    val message = "Hello message" 

    override def receive: Receive = { 
    case data: Payload => { 
     val user: Future[Option[User]] = MongoDataAccess.loadUser(data.deviceId) 
     val twillioApiAccess = context.actorOf(Props[TwillioApiAccess], "TwillioApiAccess") 
     user onComplete { 
     case Failure(exception) => println(exception) 
     case p: Try[Option[User]] => p match { 
      case Failure(exception) => println(exception) 
      case u: Try[Option[User]] => twillioApiAccess ! Action(data, u.get.get.phoneNumber, message) 
     } 
     } 
    } 

    case _ => println("received unknown message") 
    } 
} 

object MongoDataAccess extends MongoDataApi { 
    def connect(): Future[DefaultDB] = { 
    // gets an instance of the driver 
    val driver = new MongoDriver 
    val connection = driver.connection(List("192.168.99.100:32768")) 

    // Gets a reference to the database "sensor" 
    connection.database("sensor") 
    } 

    def props = Props(new MongoDataAccess) 

    def loadUser(deviceId: UUID): Future[Option[User]] = { 
    println(s"Loading user from the database with device id: $deviceId") 
    val query = BSONDocument("deviceId" -> deviceId.toString) 

    // By default, you get a Future[BSONCollection]. 
    val collection: Future[BSONCollection] = connect().map(_.collection("profile")) 

    collection flatMap { x => x.find(query).one[User] } 
    } 
} 

Dank

Antwort

0

Es gibt keine Garantie des Fund-on (.one[T]) mindestens ein Dokument in Ihrer DB übereinstimmt, so erhalten Sie ein Option[T].

Dann liegt es an Ihnen zu prüfen (oder nicht), dass das Fehlen eines Dokuments ein Fehler ist (oder nicht); z.B.

val u: Future[User] = x.find(query).one[User].flatMap[User] { 
    case Some(matchingUser) => Future.successful(matchingUser) 
    case _ => Future.failed(new MySemanticException("No matching user found")) 
} 

Using .get on Option is a bad idea anyway.

+0

, dass die Signatur der Funktion von Future [Option [Benutzer]] in der Zukunft [Benutzer], die für den anrufenden Code täuschen, wie könnte es geht zu verlangen oder einen Benutzer nicht einmal das bekommen könnte Die Zukunft ist abgeschlossen. Wie auch immer, Änderungen, die Sie vorgeschlagen haben, kehrten immer noch zurück. –

+0

Wenn ein 'Future (Option.empty [T])' zurückgegeben wird, bedeutet dies einfach, dass kein übereinstimmendes Dokument vorhanden ist. – cchantep

+0

MongoDB-Abfrage db.getCollection ('Profil'). Find ({"deviceId": "03af30d0-4dc6-11e6-beb8-9e71128cae77"}) gibt das richtige Dokument zurück. –