Mongodb: Что нужно знать перед использованием?
Я начинаю хобби (не доходный) проект с использованием Ruby on Rails. Я провел немало разработок в Rails с использованием Postgresql, и я могу довольно неплохо имитировать нормализованную схему. Тем не менее, Mongrodb выглядит блестящим и новым. Что может быть лучше, чем попробовать что-то новое, чем хобби-проект?
Вспомните, когда вы начали использовать Mongodb. Какие техники вы узнали позже, что заставило вас сказать: "Если бы я только знал об этом, когда начал!" Какие плагины вы обнаружили, что вы использовали бы с самого начала, если бы вы знали? Какие ссылки вы бы хотели добавить в закладки?
5 ответов
Я бы определенно поддержал рекомендацию MongoMapper, если вы собираетесь использовать MongoDB с Rails. Однако я предупрежу вас, что нет (пока) никакой документации, кроме пары сообщений в блоге. Если вам неудобно копаться в исходном коде, чтобы увидеть, как все работает, возможно, это еще не для вас.
Если вы работаете вне Rails, я бы рекомендовал держаться подальше от MongoMapper. Поскольку он превращает MongoDB во что-то похожее на то, что мы ожидаем от ORM с поддержкой SQL, он на самом деле не дает вам четкого представления о силе и разном мышлении, лежащем в основе MongoDB. Потратьте некоторое время на игры с драйвером ruby более низкого уровня и даже в консоли javascript.
Другая вещь, которую я бы порекомендовал, особенно если учесть, что вы знаете, как нормализовать схему, - это пока не думать о MongoDB как о базе данных. То, как вы организуете свои данные в MongoDB, сильно отличается от реляционной базы данных. Попытайтесь думать об этом больше как о месте для хранения и извлечения хэшей Ruby. С MongoDB вы можете делать некоторые реляционные вещи, но я бы рекомендовал придерживаться только автономных документов, пока вы пытаетесь обернуть голову вокруг NoSQL.
Что касается ссылок, на которые вы должны смотреть, я настоятельно рекомендую прочитать все, что вы можете на сайте MongoDB. Их документация очень хорошая. В частности, взгляните на сложные запросы, многопользовательские индексы и MapReduce, чтобы получить представление о некоторых уникальных преимуществах и преимуществах базы данных NoSQL.
Я почти на той же стадии, что и ты. Начиная новый проект с MongoDB. У меня около 7 недель опыта. Вот что я нашел очень полезным:
Используйте Mongoid вместо Mongomapper
Документация отличная. Серьезно, отлично. На чтение всей документации у вас уйдет около 15 минут, и вы получите очень точное представление о том, что вы можете и чего не можете делать с Mongoid.
Завтра выйдет кандидат на выпуск новой основной версии mongoid. Это принесет много полезных вещей.
Я использую Rails 3. Чтобы установить версию для разработчиков, добавьте это в ваш gem-файл:
gem 'mongoid', "~> 2.0.0.beta"
Текущая бета 20, но, как я уже сказал, завтра выйдет кандидат на релиз.
Также я рекомендую вам присоединиться к группе Google. У этого есть низкий трафик, и люди очень готовы ответить на любой вопрос. Например, я показал им свою первую модель БД, и они дали мне много способов улучшить это. Создатель Mongoid тоже ответит на ваши вопросы.
В двух словах: отличное сообщество.
Вот этот плагин, который позволяет вам использовать Machinist с Монго:
https://github.com/nmerouze/machinist_mongo
Работает довольно хорошо.
gem 'machinist_mongo', :require => 'machinist/mongoid',
:git => 'http://github.com/nmerouze/machinist_mongo.git',
:branch => 'machinist2'
Вы можете использовать Подделку с Машинистом. Потрясающая смесь.
https://github.com/sevenwire/forgery
Еще одна вещь, которую я хочу сказать. Я из мира реляционных баз данных, так что вначале это звучало очень странно: вы можете сохранять файлы в базе данных Монго.
На самом деле, это может быть быстрее, чем управлять ими, как мы привыкли делать. Это из-за поддержки монго для шардинга. Разделение означает, что вы можете использовать кластер компьютеров для обслуживания базы данных Mongo. Это бесшовные. Подчиненная. Таким образом, вы можете подать файл со многих компьютеров, каждый из которых отправляет часть. Масштабируется очень хорошо:)
Это делается с помощью GridFS. http://www.mongodb.org/display/DOCS/GridFS
Mongoid поддерживает эту конфигурацию master-slave.
Спросите меня, если вам нужна дополнительная информация.
Редактировать:
1. Запрос его не чувствителен к регистру
уравнение
"_id": "1da259c70fe3392c3b000002",
"name": "Dany"
array('name' => 'dany') :: results 0
array('name' => 'Dany') :: results 1
2. ID последней вставки:
$coll->insert($user, true);
echo (string) $user['_id'];
3. _id - это объект MongoId
Найти по идентификатору:
$p->findOne(array('_id' => new MongoId( $UID )), array('proj'));
Показать _id:
$coll['_id'] = ( string ) $coll['_id'];
Также _id уникален только для каждой коллекции, может отличаться на другом сервере
4. MongoDB поддерживает LIMIT,OFFSET,ORDER
для некоторой предварительной сортировки вы можете использовать Aggregation Framework.
5. В SQL это SQL-инъекция, в MongoDB это Array-инъекция
Поэтому, когда пишете какие-либо данные, используйте ( string) или проверьте is_array
$req = (string) $range['name'];
6. HDD DOS
размер _POST по умолчанию составляет 8 МБ в PHP, в Монго ограничение на документ составляет 16 МБ. Так что представьте себе, что пользователь подделывает в вашем аналитическом скрипте eq USER_AGENT STRING, а затем отправляет 16 МБ на одну вставку.
7. В прошлом были проблемы с MongoDb, но сейчас 3.0 довольно крутой и стабильный.
Вот отличный новичок / введение в подкаст MongoDb из.NET Rocks -
http://www.dotnetrocks.com/default.aspx?ShowNum=507
Майк Дирольф в интервью... он работает над проектом MongoDb. Да, и качество звука отличное.
Майк Дирольф - инженер-программист в 10gen, где он работает над проектом MongoDB. Он в основном работает над клиентскими драйверами для Python и Ruby, но также уделяет много времени обсуждению MongoDB - он выступал на EuroPython, Strange Loop Conf, RubyEnRails, RuPy и RubyConf, а также в группах встреч в Нью-Йорке, Лондоне, Вашингтоне. DC и Сан-Франциско.
Вы должны окончательно взглянуть на jongmakers mongo-mapper: http://github.com/jnunemaker/mongomapper Но я также рекомендую вам немного поиграть с чистым драйвером Ruby Mongo, чтобы увидеть, как mongo-mapper работает под капотом. Несложно поместить некоторые данные в базу данных Mongo с использованием Ruby.
Я думаю, вы уже нашли учебник по Ruby Mongo. На случай, если вы этого не сделали, вот ссылка: http://www.mongodb.org/display/DOCS/Ruby+Tutorial