В ближайшее время мне предстоит заняться разработкой высоконагруженного проекта. Поскольку использование в качестве базы данных привычной MySQL для высоких нагрузок рискованно, я решил расширить свои знания и приобрести практические навыки в использовании нереляционных баз данных.
В этой статье я рассмотрю практические примеры работы питона с документо-ориентированной базой данных MongoDB. Итак, приступим.
Скачиваем с официального сайта последнюю стабильную версию, распаковываем и видим следующую картину:
.
├── bin
│ ├── bsondump
│ ├── mongo
│ ├── mongod
│ ├── mongodump
│ ├── mongoexport
│ ├── mongofiles
│ ├── mongoimport
│ ├── mongorestore
│ ├── mongos
│ ├── mongosniff
│ └── mongostat
├── GNU-AGPL-3.0
├── README
└── THIRD-PARTY-NOTICES
Запустив сервер базы данных mogod видим следующее сообщение:
exception in initAndListen std::exception: dbpath (/data/db/) does not exist, terminating
Для нормального функционирования сервера требуется каталог, причем по умолчанию используется /data/db/. Указать другой каталог можно используя ключ –dbpath:
bin/mongod --dbpath /home/toly/db
Теперь скачаем и установим питоновскую библиотеку для работу с MongoDB:
git clone git://github.com/mongodb/mongo-python-driver.git pymongo cd pymongo sudo ./setup.py install
Перед тем как приводить примеры кода с комментариями, поясню организацию данных в MongoDB. На одном сервере может находиться несколько баз данных. В базе данных может находиться несколько, так называемых, коллекций документов. Это что-то вроде таблиц в традиционной MySQL. В коллекциях же хранятся документы. А документ представляет собой сериализованные данные в формате JSON. Документ из, например, картотеки сотрудников может выглядеть так:
{"Фамилия":"Петров",
"Имя": "Петр",
"Отчество": "Петрович",
"Адрес": {"Город": "Новосибирск",
"Улица": "Строителей",
"Дом": 12,
"Квартира": 8}}
Причем если в реляционных базах данных запись в таблице имеет заранее заданную структуру (другими словами, набор полей), то документо-ориентированных хранилищах документы жестко не структурированы и документы из одной коллекции могут иметь разный набор полей.
А теперь приведу комментированный код, демонстрирующий работу с библиотекой pymongo:
# импортируем pymongo import pymongo # соединяемся с сервером базы данных # (по умолчанию подключение осуществляется на localhost:27017) conn = pymongo.Connection() # подключаемся к другому серверу, на другой порт conn = pymongo.Connection('localhost', 27017) # выбираем базу данных db = conn.mydb # БД можно выбрать и так db = conn['mydb'] # выбираем коллекцию документов coll = db.mycoll # альтернативный выбор коллекции документов coll = db['mycoll'] # осуществляем добавление документа в коллекцию, # который содержит поля name и surname - имя и фамилия doc = {"name":"Иван", "surname":"Иванов"} coll.save(doc) # альтернативное добавление документа coll.save({"name":"Петр", "surname":"Петров"}) # выводим все документы из коллекции coll for men in coll.find(): print men # выводим фамилии людей с именем Петр for men in coll.find({"name": "Петр"}) print men["surname"] # подсчет количества людей с именем Петр print coll.find({"name": "Петр"}).count() # добавляем ко всем документам новое поле sex - пол coll.update({}, {"$set":{"sex": "мужской"}}) # всем Петрам делаем фамилию Новосельцев и возраст 25 лет coll.update({"name": "Петр"}, {"surname": "Новосельцев", "age": 25}) # увеличиваем всем Петрам возраст на 5 лет coll.update({"name": "Петр"}, {"$inc": {"age": 5}}) # сбрасываем у всех документов поле name coll.update({}, {"$unset": {"name": 1}}) # удаляем людей с возрастом более 20 лет # другие условия $gt - больше, $lt - меньше, # $lte - меньше или равно, $gte - больше или равно, $ne - не равно coll.remove({"age": {"$gt": 20}}) # удаляем все документы коллекции coll.remove({})
Вот пожалуй и все. Если есть вопросы/пожелания/предложения – буду рад услышать.

#1 by Lord_of_fear on 23 Май 2011 - 1:33
C возвращением
Я уж думал, что ты окончательно забросил свой блог.
#2 by toly on 23 Май 2011 - 9:05
Спасибо
Блог еще наполнять и наполнять
#3 by Lower on 26 Май 2011 - 22:01
+1