2014-02-09 2 views
2

Здесь ниже код для обновления документа с FindAndModify Mongo в:ReactiveMongo: Как конвертировать BSON возвращенного FindAndModify в JSON

val selector = BSONDocument("id" -> "1234") 
val modifier = BSONDocument("$set" -> BSONDocument("email" -> "[email protected]"))  

ReactiveMongoPlugin.db.command(FindAndModify(
    collection.name, 
    selector, 
    Update(modifier, false), 
    false, 
    None 
)).transform(
    success => success.map { s => 
    // doesn't work... 
    Json.fromJson[Seq[JsValue]](toJson(s)).map(for (item <- _) yield item).get 
    }.getOrElse(List[JsValue]()), 
    failure => failure match { 
    case e: LastError => DaoServiceException(e.message, Some(DATABASE_ERROR)) 
    } 
) 

В success блоке я пытаюсь преобразовать возвращенные BSONDocument коллекцию в JsValue ... но это не работает, и полученная в результате коллекция JsValue всегда пуста (я проверил коллекцию BSONDocument, возвращенную командой, и я подтверждаю, что она не пуста). Я что-то упускаю?

+1

Возможно, попробуйте использовать [BSON Обработчик implicits] (https://github.com/ReactiveMongo/Play-ReactiveMongo/blob/master/src/main /scala/play/modules/reactivemongo/bsonhandlers.scala) из Play-ReactiveMongo для преобразования из 'BSONDocument' в' JsObject'? Я предполагаю, что это лучший способ сделать это. – millhouse

ответ

9

BSON обработчики implicits (предложенная в комментарии) может не работать, потому что команда FindAndModify имеет строгую подпись вернуть Option[BSONDocument]

FindAndModify extends BSONCommandResultMaker[Option[BSONDocument]] 

дали возвращаемый результат имеет Future[Option[BSONDocument]] типа

вы можете импортировать форматы JSON

import play.modules.reactivemongo.json.BSONFormats._ 

и применять

result.map(docOpt => docOpt.map(d => Json.toJson(d))) 

на результат, или вызвать преобразование непосредственно

import play.modules.reactivemongo.json.BSONFormats 

result.map(docOpt => docOpt.map(d => 
    BSONFormats.BSONDocumentFormat.writes(d).as[JsObject])) 
+0

Я смог выполнить атомное многопотоковое обновление ... но результат всегда содержит один объект вместо коллекции, содержащей ВСЕ старые значения. Если команда обновляет два документа, я бы ожидал, что BSONArray будет содержать две записи ... или я ошибаюсь? Сейчас я немного потерялся. – j3d

+0

Думаю, теперь я понимаю ... Я думал, что FindAndModify может обновлять сразу несколько документов ... но на самом деле это не так. Он просто обновляет первый документ, соответствующий критериям выбора. Как жаль :-( – j3d

+2

Теперь это устарело, вместо этого: 'import reactivemongo.play.json.BSONFormats.BSONDocumentFormat' – Quarktum

Смежные вопросы