0

play2 アプリケーションで、いくつかのネストされた呼び出しを reactmongo と結合しようとしています。から返されたオブジェクトのリストを取得しますcreateObjects。次に、それらをループし、オブジェクトがコレクションに存在するかどうかを確認し、存在しない場合は挿入します。

def dostuff() = Action {
    implicit request =>
      form.bindFromRequest.fold(
        errors => BadRequest(views.html.invite(errors)),
        form => {
        val objectsReadyForSave = createObjects(form.companyId, form.companyName, sms_pattern.findAllIn(form.phoneNumbers).toSet)
          Async {
            for(object <- objectsReadyForSave) {
                collection.find(BSONDocument("cId" -> object.get.cId,"userId" ->
                object.userId.get)).cursor.headOption.map { maybeFound =>
                maybeFound.map { found =>
                  Logger.info("Found record, do not insert")
                } getOrElse {
                  collection.insert(object)
                }
              }
            }
            Future(Ok(views.html.invite(form)))
          }            
          })
   }

この方法は、「play2」や「reactivemongo」ではなく、できる限りではないと感じています。私の質問は次のとおりです。ネストされた呼び出しをどのように構成して、必要な結果を取得し、挿入されたオブジェクトの情報を取得する必要がありますか?

4

2 に答える 2

2

これが私がそれを書き直した方法です。

def dostuff() = Action { implicit request =>
  form.bindFromRequest.fold(
    errors => BadRequest(views.html.invite(errors)),
    form   => {
      createObjects(form.companyId,
        form.companyName,
        sms_pattern.findAllIn(form.phoneNumbers).toSet).map(ƒ)

      Ok(views.html.invite(form))
    }
  )
}

// ...
// In the model
// ...

def ƒ(cId: Option[String], userId: Option[String], logger: Logger) = {
  // You need to handle the case where obj.cId or obj.userId are None
  collection.find(BSONDocument("cId" -> obj.cId.get, "userId" -> obj.userId.get))
    .cursor
    .headOption
    .map { maybeFound =>
      maybeFound map { _ =>
        logger.info("Record found, do not insert")
      } getOrElse {
        collection.insert(obj)
      }
    }
}

いくつかの構文エラーがあるかもしれませんが、アイデアはそこにあります。

于 2013-05-22T13:40:11.230 に答える