MongoDB и python


В ближайшее время мне предстоит заняться разработкой высоконагруженного проекта. Поскольку использование в качестве базы данных привычной 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. #1 by Lord_of_fear on 23 Май 2011 - 1:33

    C возвращением :) Я уж думал, что ты окончательно забросил свой блог.

  2. #3 by Lower on 26 Май 2011 - 22:01

    Lord_of_fear :
    C возвращением Я уж думал, что ты окончательно забросил свой блог.

    +1 :)

  3. #4 by олег on 15 Апрель 2014 - 17:18

    [root@vps-1028740-7039 ~]# service mongod start
    Starting mongod: about to fork child process, waiting until server is ready for connections.
    forked process: 1683
    all output going to: /var/log/mongo/mongod.log
    ERROR: child process failed, exited with error number 45
    [FAILED]

    не запускается монго ! подскажите как поправить ???

(никто не узнает)