Учитывая, что никто не упомянул об этом ...
Некоторые языки высокого уровня, такие как Python и Java, поставляются с инструментами для преодоления ограничений двоичной с плавающей запятой. Например:
decimal
Python [и g0] и класс BigDecimal
Java [], которые представляют числа внутри с десятичной нотацией (в отличие от двоичная запись). Оба имеют ограниченную точность, поэтому они все еще подвержены ошибкам, однако они решают наиболее распространенные проблемы с бинарной арифметикой с плавающей запятой. Десятичные числа очень хороши при работе с деньгами: десять центов плюс двадцать центов всегда ровно тридцать центов: >>> 0.1 + 0.2 == 0.3
False
>>> Decimal('0.1') + Decimal('0.2') == Decimal('0.3')
True
Модуль decimal
Python основан на стандарте IEEE стандарта 802.118 . fractions
модуль и класс Apache Common BigFraction
. Оба представляют собой рациональные числа как пары (numerator, denominator)
, и они могут давать более точные результаты, чем десятичная арифметика с плавающей запятой. Ни одно из этих решений не идеально (особенно, если мы смотрим на выступления, или если мы требуют очень высокой точности), но все же они решают большое количество проблем с двоичной арифметикой с плавающей запятой.
Во-первых, несколько проницательных ссылок о схематических данных:
Second ... можно задаться вопросом, является ли Spring или Java правильным решением для вашей проблемы - почему не более динамичный инструмент, такой Ruby, Python или Mongoshell?
. Говоря об этом, давайте сосредоточимся на технической проблеме.
Если ваша цель состоит только в том, чтобы хранить случайные данные, вы могли бы в принципе просто определите свой собственный контроллер и непосредственно используйте Java-драйвер MongoDB.
Если вы действительно настаиваете на отсутствии предопределенной схемы для вашего класса объектов домена, вы можете использовать что-то вроде:
@Document(collection = "users")
public class User implements UserDetails {
@Id
private String id;
private Object data;
// getters/setters omitted
}
данные также могут быть определены как Map, com.mongodb.DBObject, com.mongodb.BasicDBObject или com.mongod.B.BasicDBList.
В основном это дает вам поле, в котором вы можете поставьте все, что захотите, но следите за проблемами сериализации / десериализации (это может стать сложным, если у вас есть Objec tIds и DBRefs в вашем вложенном документе). Кроме того, обновление данных может стать неприятным, если иерархия данных становится слишком сложной.
Тем не менее, в какой-то момент вы поймете, что у ваших данных действительно есть схема, которая может быть точно определена и помещена в четко определенные POJOs.