У меня возникли некоторые трудности с 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
). Поэтому я борюсь с этим. Пожалуйста, свяжитесь с нами, если вы видите проблему здесь. Большое спасибо!