ReactiveMongo Ошибка поиска одного документа
С помощью следующего бита кода я пытаюсь получить один документ на основе электронной почты пользователя, где электронная почта является частью хранимого документа:
def userByEmail(encryptedEmail: String): Future[Either[ServiceError, User]] = async {
println(s"finding a user for email $encryptedEmail")
val inlandDb = dbConn.db(dbName)
val userColl = inlandDb[BSONCollection](userCollection)
val found = await(
userColl.find(BSONDocument(emailKey -> BSONString(encryptedEmail))).one[User]
)
println(s"found a user $found")
found match {
case Some(user) => Right(user)
case None => Left(ServiceError("user not found"))
}
}
Пользователь для данного письма существует, как я его проверил в консоли Монго. Что-то не так? Почему я не могу вернуть пользователя для моего поискового запроса.
Должен ли я иметь какой-либо индекс по электронной почте в моем пользовательском документе, чтобы его можно было искать?
Я получаю следующую ошибку:
finding a user for email Ctkiaw/cbW8DxtRIxbtUYADq5bp6uW7tVryhpT57lKU=
failed java.lang.RuntimeException: None.get
None.get
java.lang.RuntimeException: None.get
at scala.sys.package$.error(package.scala:27)
at play.api.libs.iteratee.Iteratee$$anonfun$run$1.apply(Iteratee.scala:396)
at play.api.libs.iteratee.Iteratee$$anonfun$run$1.apply(Iteratee.scala:389)
at play.api.libs.iteratee.StepIteratee$$anonfun$fold$2.apply(Iteratee.scala:706)
at play.api.libs.iteratee.StepIteratee$$anonfun$fold$2.apply(Iteratee.scala:706)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109)
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
at scala.concurrent.Promise$class.complete(Promise.scala:55)
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Вот моя модель пользователя:
case class User(
_id: Option[String],
firstName: String,
lastName: String,
email: String,
pass: String,
address: Address,
createDate: DateTime,
activateDate: Option[DateTime],
isUserActivated: Boolean,
verificationDate: Option[DateTime]
)
Вот как я делаю преобразование:
implicit object UserBSONHandler
extends BSONDocumentReader[User] with BSONDocumentWriter[User] {
def read(doc: BSONDocument): User = {
User(
_id = doc.getAs[String]("_id"),
createDate = doc.getAs[BSONDateTime](createDateKey).map(dt => new DateTime(dt.value, DateTimeZone.UTC)).get,
activateDate = doc.getAs[BSONDateTime](activateDateKey).map(dt => new DateTime(dt.value, DateTimeZone.UTC)),
verificationDate = doc.getAs[BSONDateTime](verificationDateKey).map(dt => new DateTime(dt.value, DateTimeZone.UTC)),
firstName = doc.getAs[String](firstNameKey).get,
lastName = doc.getAs[String](lastNameKey).get,
email = doc.getAs[String](emailKey).get,
pass = doc.getAs[String](passKey).get,
address = doc.getAs[Address](addressKey).get,
isUserActivated = doc.getAs[Boolean](isUserActivatedKey).get
)
}
def write(user: User): BSONDocument = {
BSONDocument(
firstNameKey -> user.firstName,
lastNameKey -> user.lastName,
emailKey -> user.email,
passKey -> user.pass,
addressKey -> user.address,
createDateKey -> user.createDate.toString(Iso8601DateFormatter),
activateDateKey -> user.activateDate.map(dt => dt.toString(Iso8601DateFormatter)),
verificationDateKey -> user.verificationDate.map(dt => dt.toString(Iso8601DateFormatter)),
isUserActivatedKey -> user.isUserActivated
)
}
}
2 ответа
Из журналов видно, что что-то в ваших чтениях отключено. Исходный код, приведенный выше, синтаксически в порядке, но сообщение об ошибке вместе с кодом регистрации помогли мне сосредоточиться на дальнейшей проверке BSONDocumentReader.
С помощью "Барри" я смог понять, в чем проблема. Мне пришлось изменить метод чтения, как показано ниже:
def read(doc: BSONDocument): User = {
User(
_id = doc.getAs[String]("_id"),
createDate = doc.getAs[String](createDateKey).map(dt => new DateTime(dt, DateTimeZone.UTC)).get,
activateDate = doc.getAs[String](activateDateKey).map(dt => new DateTime(dt, DateTimeZone.UTC)),
verificationDate = doc.getAs[String](verificationDateKey).map(dt => new DateTime(dt, DateTimeZone.UTC)),
firstName = doc.getAs[String](firstNameKey).get,
lastName = doc.getAs[String](lastNameKey).get,
email = doc.getAs[String](emailKey).get,
pass = doc.getAs[String](passKey).get,
address = doc.getAs[Address](addressKey).get,
isUserActivated = doc.getAs[Boolean](isUserActivatedKey).get
)
}