Как получить доступ к двоичным данным в mongoDB из scala (casbah)

Я новичок в mongoDB, так что это может быть очень глупый вопрос...

Я пытаюсь получить доступ к хранилищу сеансов rails mongo из scala.

val sessions = MongoConnection("localhost", 27017)("databaseName")("sessions")
val session = sessions.findOneById("1qzyxraa27shwq2qctkon44fl")

Если я распечатаю сеанс, он будет выглядеть так:

Some({ "data" : <Binary Data> , "_id" : "1qzyxraa27shwq2qctkon44fl" , "updated_at" : { "$date" : "2013-05-09T04:58:21.054Z"} , "created_at" : { "$date" : "2013-05-09T04:58:21.054Z"}})

Если я напечатаю поле updated_at:

val updatedAt = session.get("updated_at")
Thu May 09 00:58:21 EDT 2013

Меня интересует поле данных:

val data = session.get("data")

Проблема в том, что я не совсем уверен, что с этим делать, я не могу преобразовать его в строку или, кажется, преобразовать его во что-либо, что я пробовал.

В БД, если я найду его вручную, поле отображается как:

BinData(0,"BAh7BkkiEF9jc3JmX3Rva2VuB......")

И я могу обработать эту строку base64 вручную, но как мне получить что-то, что я могу обработать с помощью casbah?


person jgrowl    schedule 10.05.2013    source источник
comment
Это актуально? stackoverflow .com/questions/13958089/   -  person Sarah Vessels    schedule 11.05.2013
comment
Это также может быть актуально: .com/questions/8244110/   -  person Sarah Vessels    schedule 11.05.2013


Ответы (1)


После долгих поисков в Google я нашел эту проблему на трекере. Несмотря на то, что он говорит, что это было исправлено в 2.8, он по-прежнему показывает только «BinaryData» для mongo-java-driver-2.11.1.

Для ваших данных можно выполнить следующий вызов, чтобы он вернул полные данные, как и ожидалось:

com.mongodb.util.JSONSerializers.getStrict().serialize(...)

Используя ObjectMapper Джексона, я смог сделать что-то подобное, чтобы получить только поле двоичных данных:

val session = sessions.findOneByID("1qzyxraa27shwq2qctkon44fl")
val data = com.mongodb.util.JSONSerializers.getStrict.serialize(session.get.get("data"))
val mapper = new ObjectMapper()
val tree = mapper.readTree(data)
println(tree.get("$binary"))
person jgrowl    schedule 11.05.2013
comment
Являются ли два вызова .get.get преднамеренными в строке 2? - person Sarah Vessels; 11.05.2013
comment
Да, требуется. Первый получает, получает коллекцию, второй получает столбец. - person jgrowl; 14.05.2013