Невозможно обновить или удалить многие в реактивном Монго 0.16 - PullRequest
1 голос
/ 04 мая 2019

У меня возникли некоторые трудности с delete.many и update.many с использованием новых компоновщиков , когда я пытаюсь преобразовать (работающий) код моей предыдущей версии в реактивный мононго 0.16.5 ("org.reactivemongo" %% "play2-reactivemongo" % "0.16.5-play26", "org.reactivemongo" %% "reactivemongo-akkastream" % "0.16.5").Посмотрим, я использую это в плагине Play, поэтому имею дело с JSON (а не BSON)

Я собираюсь из официальной документации здесь . Мои ошибки похожи для обоихupdate & delete, поэтому я просто напишу для update здесь, чтобы держать его обрезанным.

Команда обновления

    def updateMany(collName: String)(quJsa: JsArray)(orderedBool: Boolean = false): Future[MultiBulkWriteResult] = {

        lazy val updateBuilder = getCollection(collName).map(_.update(orderedBool))

        quJsa.asOpt[Seq[JsObject]].map(
          _.map(
            x => x.as[MongoUpdateBuilder]
          )
        ).map(
          _.map(
            x => updateBuilder.flatMap(
              _.element(q = x.q, u = x.getSetUpdate, upsert = x.upsertBool, multi = x.multiBool)
            )
          )
        ).map(
          x => Future.sequence(x)
        ).map(
          _.flatMap(
            x => updateBuilder.flatMap(
              _.many(x)
            )
          )
        ).getOrElse(getMultiBulkWriteResultErrorF("input not recognised as jsarr"))

    }

Пользовательскиймодель построителя обновлений

    case class MongoUpdateBuilder(q: JsObject, u: JsObject, upsertBool: Boolean, multiBool: Boolean) {
        def getSetUpdate = Json.obj("$set" -> u)
    }

    object MongoUpdateBuilder {
        implicit val mongoUpdateBuilderFormat = Json.format[MongoUpdateBuilder]
}

Ошибка контейнера

      def getMultiBulkWriteResultErrorF(errStr: String): Future[MultiBulkWriteResult] = {

        val mbwr = MultiBulkWriteResult(
          ok = false,
          n = 0,
          nModified = 0,
          upserted = Seq(),
          writeErrors = Seq(WriteError(index = 0, code = 404, errmsg = errStr)),
          writeConcernError = None,
          code = Some(404),
          errmsg = Some(errStr),
          totalN = 0
        )

        Future.successful(mbwr)
      }

И главная проблема:

нет параметров типа дляМетод flatMap: (f: reactivemongo.play.json.collection .JSONCollection # UpdateBuilder => scala.concurrent.Future [S]) (неявный executor: scala.concurrent.ExecutionContext) scala.concurrent.Future [S] существует так, что он существуетможет быть применено к аргументам.nt.Future [_1.UpdateCommand.UpdateElement] forSome {val _1: reactivemongo.play.json.collection.J SONCollection}) [error] --- потому что тип выражения аргумента --- [error] не совместим с формальным типом параметра;[ошибка] найдено: Reaction.MSON.play.json.collection.JSONCollection # UpdateBuilder => scala.concurrent.: reactivemongo.play.json.collection.JSONCollection # UpdateBuilder => scala.concurrent.Future [? S] [error] x => updateBuilder.flatMap (

Таким образом, проблема заключается в этой строке- updateBuilder.flatMap. Future не может быть flattened с этими типами (JSONCollection#UpdateBuilder & JSONCollection#UpdateCommand.UpdateElement). Поэтому я борюсь с этим. Пожалуйста, свяжитесь с нами, если вы видите проблему здесь. Большое спасибо!

...