Работа с изменениями схемы в MongoDB - PullRequest
3 голосов
/ 19 октября 2011

Я использую MongoDB в одном из моих проектов Java.После изменения схемы БД я обнаружил, что изменяю существующий код во многих местах, чтобы выполнить изменение, например:

Object result = collection.findOne();

до

Object result = collection.findOne().get("ThisField").get("ThatField");

Теперь все относительно простоfindOne(), но они становятся более сложными, когда find() и связанные курсоры начинают играть.

В большинстве случаев было бы намного проще, если бы я мог изменить запрос , а не его результат.Я уже экспериментировал с , получая только специфические поля , но, насколько я могу судить, он маскирует только остальные поля - это не меняет структуру объекта.

  • Можно ли задать запрос так, чтобы объекты, которые формируют значения определенного поля, "повышались" до объекта верхнего уровня, таким образом удаляя вызовы .get("this").get("that")?

  • В качестве дальнейшего шага, поддерживает ли MongoDB какой-либо эквивалент представлений , как это видно в обычных базах данных?Что-то, что могло бы позволить существующему коду продолжать работать в случае изменения схемы?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Кажется, что MongoDB в настоящее время не имеет серверного эквивалента представлений реляционной базы данных. Поддержка MongoDB Map / Reduce , очевидно, подходит только для пакетных операций, что делает ее бесполезной для онлайновой базы данных с обновлениями в реальном времени.

В качестве обходного пути я обратился к клиентскому решению. Я воспользовался тем фактом, что драйвер Java является открытым исходным кодом, и поэтому я мог легко понять, как он структурирован.

Более конкретно, я смог расширить и заменить декодер BSON по умолчанию для интересующих коллекций и прозрачно переместить перемещенные поля.

0 голосов
/ 20 октября 2011

Ответом на ваш второй вопрос, вероятно, является функция Map / Reduce . Однако есть несколько соображений:

  • Map / Reduce обычно используется для выполнения агрегированных вычислений, но его можно использовать как представление в том смысле, что он будет проходить через каждый объект в коллекции и генерировать выходную коллекцию, в которой ваши документы агрегируются (рассчитывается, суммы и т. д.) или преобразуются ( для каждого документа, если ThisField присутствует, возвращают ThisField, в противном случае возвращают ThatField )

  • Он запускается на сервере, поэтому вы можете планировать задания для генерации ваших коллекций (представляя концепцию представления); Тем не менее, вы должны учитывать, что MapReduce не подходит для онлайн-запросов. Он предназначен для выполнения фоновых заданий с целью очень эффективного преобразования данных, но не для выполнения запросов (если у вас только небольшая коллекция).

Поэтому я хотел бы добавить, что если вы хотите «перенести» свою схему, вы можете запустить карту / уменьшить и сохранить ее как новую постоянную коллекцию с новой схемой. Все, что вам нужно сделать, чтобы продолжить программирование с использованием новой схемы, - это использовать новую коллекцию.

...