2012-07-09 2 views
1

В касбы, есть два метода называемых .getAs и .getAsOrElse в MongoDBObject, который возвращает значения в соответствующих полях в типе, который данный в качестве параметра типа.Касбы MongoDB более типизированный способ доступа к параметрам объекта

val dbo:MongoDBObject = ... 
dbo.getAs[String](param) 

Это необходимо использовать приведение типов, потому что мы можем получить Long как String, придав ему в качестве параметра типа, который может причиненный тип исключения произнесения во время выполнения. Есть ли какой-либо другой тип доступа к исходному типу в результате?

Это должно быть возможно, потому что информация о типе элемента должна присутствовать на выходе getAs.

ответ

0

Проблема в том, что mongodb может хранить несколько типов для одного поля, поэтому я не уверен, что вы подразумеваете под этим типом. Невозможно обеспечить его соблюдение на стороне базы данных, так как вы надеялись, что есть способ обеспечить его соблюдение на стороне casbah? Вы могли бы просто сделать get("fieldName") и получить Object, чтобы быть безопасным - но это вряд ли улучшится, на мой взгляд.

Я был счастлив с помощью Salat + Casbah, и когда моя запись базы данных не соответствует моему классу Case Salat, я получаю исключение во время выполнения. Я просто знаю, что мне нужно запускать сценарии миграции, когда я меняю типы в своей модели или создаю новую модель для новых типов (несколько моделей могут храниться в одной коллекции). По крайней мере, методы Salat grater/DAO делают его менее сложным (вам не нужно указывать типы каждый раз, когда вы обращаетесь к переменной).

+0

Я полностью согласен с комбинацией Salat + Casbah; он полностью освобождает вас от необходимости беспокоиться о проблемах безопасности типов! –

1

Отметьте это отлично presentation на Salat автор. То, что вы ищете, это Salat grater, который может конвертировать в DBObject и обратно.

+0

Я согласен, что Салат отлично работает для меня. Это работает как сериализатор JSON с некоторой адаптацией к MongoDB. Но на самом деле я тоже использую его для создания JSON моего MongoDB, чтобы индексировать его на ElasticSearch. –

1

Юридическая информация: я пристрастен, как я автор Subset

Я построил эту маленькую библиотеку «Подмножество» именно по той причине, чтобы иметь возможность эффективно работать с DBObject «s полей (как скалярных, так и суб- документы) безопасным образом. Просмотрите Examples и посмотрите, подходит ли оно вашим потребностям.

+0

Выглядит отлично! Может ли он также запрашивать внешние идентификаторы (например, в вашем примере твит, пользователь не будет вложенным документом, а ObjectId) в виде шрифтов? Я пока не нашел решения для этого. –

+0

Marius, я не совсем понимаю, чего вы пытаетесь достичь .. эмулировать 'DBRef'? .. не могли бы вы открыть вопрос и пригласить меня туда, я постараюсь придумать решение –

+0

Там вы идете: http://stackoverflow.com/questions/11990003/mapping-mongodb-documents-to-case-class-with-types-but-without-embedded-document –