Mongodb как пользоваться
Перейти к содержимому

Mongodb как пользоваться

  • автор:

Поработаем с MongoDb

В текущее время появляется всё больше high-load проектов оперирующие колоссальным объемом данных. И уже нельзя обойтись классической реляционной моделью хранения этой информации. Всё более популярными становятся NoSQL базы данных (NoSQL — обозначает Not only SQL). Одной из таких баз данных является MongoDB, которая уже заслужила внимание к себе таких компаний как Disney, craiglist, foursquare. К тому же тут неоднократно писали о ней:
NoSQL, используя MongoDB, NoRM и ASP.NET MVC
Шардинг MongoDB на пальцах
Репликация MongoDB на пальцах

Это еще одна статья о работе с MongoDb в среде .net.

Создание базы данных.

По умолчанию база данных находится в папке c:/data/db

Запустим mongo.exe и создадим новую базу данных:

use mongoblog 

Сразу же установим параметры доступа (имя пользователя и пароль):

db.addUser("admin", "masterkey") 

Особенностью MongoDb является то, что это документо-ориентированная база данных, и не содержит информацию о структуре, так что тут мы закончили. Сразу переходим к описанию моделей данных.

У нас будет две сущности Article (Статья) и Comment (Комментарий), и Статья будет содержать множество Комментариев:

public partial class Article < [BsonId] public ObjectId Id < get; set; >//указывает что это свойство - id поле объекта public string Url < get; set; >public string Title < get; set; >public string Teaser < get; set; >public string Content < get; set; >public DateTime AddedDate < get; set; >public List Tags < get; set; >public bool IsPublished < get; set; >public string Bulk < get; set; >public List Comments < get; set; >public Article() < Tags = new List(); Comments = new List(); > > public partial class Comment < [BsonId] public ObjectId Id < get; set; >//указывает что это свойство - id поле объекта public DateTime AddedDate < get; set; >public string Content < get; set; >public Comment() < >> 
  • подключение к Mongo
  • добавление статьи
  • изменение статьи
  • индексация
  • удаление статьи
  • вывод статей (фильтрация/пейджинг/сортировка)
  • добавление комментариев
  • удаление комметариев
  • поиск
  • бекап базы

#1 Подключение к базе.

По умолчанию база занимает порт 27017 на сервере (у нас как обычно localhost). Подключаемся к базе:

public MongoDBContext(string ConnectionString, string User, string Password, string Database)

#2/#3 Добавление/изменение записи

Для добавления объекта в коллекцию необходимо получить коллекцию по имени

var collection = database.GetCollection(table); 

Для добавления можно выполнить команду:

collection.Insert(obj); 

или (как и для изменения)

collection.Save(obj); 

MongoDb самостоятельно добавляет поле _id — уникальный параметр. Если при выполнении команды Save у объекта будет Id существующий уже в коллекции, то выполнится апдейт этого объекта.

#4 Индексация

Для быстрого поиска мы можем добавить индекс по какому-либо полю. Для индексации используется команда

collection.EnsureIndex(IndexKeys.Descending("AddedDate")); 

Это ускорит сортировку по этому полю.

#5 Удаление

Для удаления по id создается запрос (Query). В данном случае это

var query = Query.EQ("_id", id) 

и выполняется команда:

collection.Remove(query); 

#6 Вывод статей

Для вывода значений применив фильтр и отсортированных, да еще и с пейджингом используется курсор.
Например чтобы выбрать из коллекции неудаленные (IsDeleted = false) отсортированные по дате убывания (AddedDate desc) 10ю страницу (пропускаем 90 элементов и выводим 10 следующих) составляется такой курсор:

var cursor = collection.Find(Query.EQ("IsDeleted", false)); cursor.SetSortOrder(SortBy.Descending("AddedDate")); cursor.Skip = 90; cursor.Limit = 10; foreach (var obj in cursor)

#7 Добавление комментариев.

Так как MongoDb — документо-ориентированная база данных, то не существует отдельной таблицы с комменатариями, а комментарий добавляется в массив комментариев в статье, после чего статья сохраняется:

var article = db.GetByID("Articles", articleId); comment.AddedDate = DateTime.Now; article.Comments.Add(comment); db.Save("Articles", article); 

#8 Удаление комментария.

Комментарий удаляется точно так же. Мы получаем объект article, удаляем из списка комментариев текущий комментарий и сохраняем объект.

#9 Поиск.

Для того чтобы найти элемент содержащий заданную подстроку необходимо задать следующий запрос:

Query.Matches("Text", @".*искомое слово.*"). 

Есть 2 проблемы так как поиск учитывает регистр, т.е. Петя != петя, и к тому же у нас есть много полей.
Первую проблему можно решить использовав регулярные выражения

Но чтобы избавится от обеих проблем сразу я создал поле Bulk куда в нижнем регистре записываются все поля + комментарии и ищу по этому полю.

#10 Бекап базы.

Именно бекап а не репликация. Для того чтобы иметь доступ к файлу базы данных нужно выполнить lock (база продолжит работать, только в этот момент все команды записи будут кешироваться, чтобы потом выполнится). После чего базу данных можно скопировать, заархивировать и выложить на ftp. После этой процедуры базу надо разлочить (Unlock).
Команды:

public void Lock() < var command = new CommandDocument(); command.Add("fsync", 1); command.Add("lock", 1); var collection = server.AdminDatabase.RunCommand(command); >public void Unlock()

Если что-то пойдет не так, то сервер БД надо будет перезапустить с командой:

mongod --repair 

Исходники

Пробное приложение (на asp.net mvc) можно найти по адресу:
https://bitbucket.org/chernikov/mongodbblog

Да, и по поводу производительности по отношению к остальным вот ссылка.

Основы базы данных MongoDB

Мы привыкли работать с реляционными базами данных, преимущественно с использованием языка SQL. Однако существует множество СУБД, не поддерживающих данную парадигму, так называемых NoSQL. Может возникнуть вопрос, а зачем нужны такие СУБД? Давайте представим, что нам необходимо хранить базу разнообразных документов, причем у них могут быть разнообразные поля. В случае реляционной СУБД мы можем на каждый тип документов завести отдельную таблицу. Но что если существуют поля, которые могут отсутствовать у некоторых документов? В парадигме реакционных СУБД мы можем заполнять несуществующие поля значением NULL. Но что если у каждого документа может быть вообще разный состав полей, и это не разные типы документов, а все документы одного вида?

Давайте рассмотрим пример. Пусть нам необходимо хранить описания и рецептуру блюд. В парадигме реляционной СУБД мы будем создавать таблицу с перечнем блюд, и отдельную таблицу с рецептурой (перечень ингредиентов), которая связана с таблицей блюд отношением один ко многим. В таблице рецептуры у нас есть такие поля, как ингредиент, его количество, единица измерения. Эта таблица в свою очередь связана с таблицей ингредиентов отношением много ко многим. Но тут еще нужна таблица для единиц измерений. И вот у нас уже «зоопарк» связанных таблиц.

А теперь подумаем, как вся эта структура будет представлена в памяти компьютера. Если мы программируем в парадигме ООП, то у нас наверняка должна быть коллекция блюд, объект этой коллекции – блюдо, содержит коллекцию «рецептура», элемент которой содержат поле типа объект «ингредиент», количество, единицу измерения. Последнее тоже объект. А теперь представим, что у нас есть некий абстрактный класс «Единица измерения», от которого наследуется конкретная единица измерения. Аналогично и с ингредиентами. Разумеется, все поля классов замаплены на конкретные столбцы соответствующих объекту таблиц. Но что если в каком-нибудь дочернем классе появятся новые поля? Добавлять таблицы для этих классов, раздувать «зоопарк» таблиц еще больше?

Другой вариант архитектуры – это документоориентированная NoSQL СУБД, например, MongoDB. О ней и пойдет речь в этой статье. Я расскажу, как создать базу данных MongoDB и работать с ней средствами языка Python.

Итак, регистрируемся на сайте https://www.mongodb.com. Обратите внимание, из России этот сервис не работает, видимо из-за санкций, так что используйте прокси. Далее на закладке Database создадим новую базу данных:

Создадим новую базу данных MongoDB

База данных представлена в виде дерева, «листики» которого – это таблица. Если кликнуть по таблице, то можно увидеть ее содержимое:

Содержимое базы данных MongoDB

Как видим, документы, извлекаемые из базы данных, представляют собой JSON-объекты. Здесь же есть кнопки для создания и удаления объектов базы данных, кроме того, можно ввести фильтр для выборки данных.

Каким образом подключиться к базе данных через Python?

Для начала надо установить и подключить библиотеку pymongo. Это можно сделать через pip, введя вот такую команду в командную строку:

Ну и можно пользоваться:

import pymongo from pymongo.server_api import ServerApi client = pymongo.MongoClient("Строка подключения", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) my_collection = db.foods my_collection.delete_many( < "calories": < "$lt": 300 >>) 

Сформировать строку подключения можно в браузере mongoDB, нажав на кнопочку «Connect»:

Формирование строки подключения в MongoDB

Откроется вот такое окно, там надо выбрать «Connect your application»:

Подключение в MongoDB

Выбираем язык Python:

Выбираем язык Python в MongoDB

И видим строку подключения:

Строка подключения в MongoDB

Копируем ее в программу, вместо ставим ваш реальный пароль.

Чтобы создать новую таблицу, можно воспользоваться методов create_collection базы данных:

import pymongo from pymongo.server_api import ServerApi client = pymongo.MongoClient("mongodb+srv://megabax:@cluster0.vwremdq.mongodb.net/?retryWrites=true&w=majority", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) db.create_collection("MyTable") 

После выполнения программы в списке таблиц базы данных появится наша таблица:

Таблица в базе данных MongoDB

В общих чертах, как работать с базой данных mongoDB. Как видим из примеров кода, сначала мы создаем подключение (клиента). Через него получаем объект базы данных (это поле объекта клиента, имя которого совпадает с именем базы данных). Сам объект базы данных содержит в себе поля, соответствующие таблицам. Эти таблицы представляют собой коллекцию элементов таблицы. Эти коллекции содержат в себе методы по манипулированию данными, такие как перебор элементов, поиск, добавление и удаление. Давайте, например, создадим тестовую базу данных, путем добавления в цикле множества элементов методом insert_one:

import pymongo from pymongo.server_api import ServerApi import random import string def generate_random_string(length): letters = string.ascii_lowercase rand_string = ''.join(random.choice(letters) for i in range(length)) print("Random string of length", length, "is:", rand_string) return rand_string def get_random_features(): dict=<> ln=random.randint(1,10) for i in range(ln): dict["feature"+str(i)]=generate_random_string(random.randint(3,15)) return dict client = pymongo.MongoClient("mongodb+srv://megabax:@cluster0.vwremdq.mongodb.net/?retryWrites=true&w=majority", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) mongo_collection = db.goods for i in range(100): mongo_collection.insert_one(< "_id": i, "name": generate_random_string(random.randint(3,15)), "price": round(random.random()*100,2), "features": get_random_features(), "quantity": random.randint(1,10000) >) 

Теперь попробуем перебрать элементы таблицы:

import pymongo from pymongo.server_api import ServerApi client = pymongo.MongoClient("mongodb+srv://megabax:@cluster0.vwremdq.mongodb.net/?retryWrites=true&w=majority", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) my_collection = db.goods my_cursor = my_collection.find() for item in my_cursor: print(item["name"]) 

Этот код переберет все элементы, и выведет значения их полей name. Можно перебрать по фильтру:

my_cursor = my_collection.find(< "name": "jgdpspvonpune" >) 

Стоит заметить, что в качестве полей у элементов коллекции может быть и коллекция, и какой-либо другой объект. Например, у элемента коллекции goods есть элемент features, который сам по себе является объектом, а именно словарем:

Словарь в MongoDB

А сейчас мы сделаем следующее. Очистим коллекцию goods, а потом снова перезаполним ее, но немного по-другому. Для этого можно вызвать метод delete_many(), а в качестве параметров указать пустой фильтр:

import pymongo from pymongo.server_api import ServerApi client = pymongo.MongoClient("mongodb+srv://megabax:@cluster0.vwremdq.mongodb.net/?retryWrites=true&w=majority", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) my_collection = db.goods my_collection.delete_many(<>) 

Результатом работы скрипта будет полная очистка коллекции:

Очистка коллекции в MongoDB

Теперь поменяем в нашем скрипте формирования демо базы всего лишь одну функцию:

def get_random_features(): list=[] ln=random.randint(1,10) for i in range(ln): list.append(generate_random_string(random.randint(3,15))) return list 

Теперь вместо объекта в поле features у нас коллекция, а не объект:

Коллекция в MongoDB

И теперь мы можем осуществить поиск по элементу коллекции:

my_cursor = my_collection.find( < "features": >) 

Запрос найдет все документы, в которых в коллекции features встретится строка «hpwfslrwfsuqmue».

Проверка в MongoDB

Выражение $eq в фильтре означает «равно». Можно сравнивать на больше меньше, например, «меньше или равно» будет кодироваться как $lt:

import pymongo from pymongo.server_api import ServerApi client = pymongo.MongoClient("mongodb+srv://megabax:@cluster0.vwremdq.mongodb.net/?retryWrites=true&w=majority", server_api=ServerApi('1')) db = client.test try: print("MongoDB version is %s" % client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1) my_collection = db.goods my_cursor = my_collection.find( < "price": >) for item in my_cursor: print(item["name"], item["price"]) 

Эта программа выдаст список товаров, цена которых не превышает 10.

Более подробно о фильтрах и прочих возможностях mongjDB можно прочитать в документации MongoDB Documentation.

Введение в MongoDB. Руководство для начинающих

Введение в MongoDB. Руководство для начинающих

MongoDB — система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц. Классифицирована как NoSQL, использует JSON-подобные документы и схему базы данных.

Вступление

С переходом парадигмы в сторону динамического контента, спрос на базу данных No-SQL вырос. Это привело к появлению многочисленных No-SQL баз данных, таких как MongoDB.

MongoDB, классифицированная как база данных No-SQL, представляет собой базу данных на основе документов, в которой хранятся данные в виде документов JSON, автоматически сгенерированные для каждого документа.

База данных без SQL — это база данных, в которой структура таблиц не является фиксированной, в отличие от структурированных баз данных SQL. MongoDB хранит данные в виде строки JSON независимо от количества атрибутов или имени атрибутов в определенном столбце.

Это позволяет разработчикам быстро вносить изменения в объекты без необходимости каких-либо изменений на уровне базы данных.

MongoDB

Установка MongoDB

MongoDB, как и любая другая база данных, доступна в нескольких вариантах в зависимости от потребностей разработки.

  • MongoDB Atlas — База данных как услуга
  • Сервер совместной работы — бесплатный для сообщества разработчиков
  • MongoDB Enterprise Edition — коммерческая версия с дополнительными функциями

Каждый из них полностью совместим с любой операционной системой. Для начала, загрузите соответствующий установочный файл в соответствии с вашей операционной системой.

Процесс установки немного отличается для каждой операционной системы, и, следовательно, мы будем проходить установку каждой операционной системы отдельно.

Установка на MacOS

Загрузите архив .tgz, содержащий необходимые двоичные файлы. Разархивировав его, вы сможете просмотреть набор двоичных файлов, расположенных в папке bin.

  • Переместите папку bin в нужное место
  • Откройте терминал и измените каталог на каталог bin.
  • Выполните приведенную ниже команду, чтобы создать базу данных в нужном месте.
$ ./mongod --dbpath /path-to-desired-directory/
  • В приведенной выше команде замените путь к каталогу желаемым путем, и сервер будет запущен, как только команда будет выполнена.

Установка на Windows

Центр загрузки MongoDB предоставляет исполняемый MSI — пакет для установки MongoDB в Windows. Установка в Windows довольно проста и может быть выполнена с помощью нескольких команд после загрузки установки.

  • Выполните приведенные ниже команды для установки MongoDB на ПК с Windows
> cd /setup-folder/ > msiexec.exe /q /i .msi ^ INSTALLLOCATION="C:\Program Files\MongoDB\" ^ ADDLOCAL="MonitoringTools,ImportExportTools,MiscellaneousTools"

Приведенные выше команды приведут вас в соответствующий каталог и выполнят установку в указанном месте. После установки вам необходимо настроить путь к хранилищу базы данных по умолчанию для MongoDB. Команда ниже поможет вам настроить

> md \db\data

Приведенная выше команда создает папку db/data в каталоге, на который в данный момент указывает командная строка. В случае, если вам нужно заново настроить базу данных, вы можете использовать mongod.exe с аргументом dbpath, как показано ниже:

>"C:\Program Files\MongoDB\bin\mongod.exe" --dbpath d:\tutorial\mongodb\data

Установка на Linux

Как и в случае установки на MacOS, MongoDB для Linux-версий также доступна в виде архивированной группы двоичных файлов. Процесс установки MongoDB довольно похож.

  • Переместить двоичные файлы в нужное место
  • Откройте терминал в папке
  • Выполните приведенную ниже команду с желаемым расположением БД
$ ./mongod --dbpath /path-to-desired-directory/

Создание первой коллекции

MongoDB хранит данные в форме документов JSON. Группа такой документации все вместе известна как коллекция в MongoDB. Таким образом, коллекция аналогична таблице в реляционной базе данных, а документ аналогичен записи.

Для хранения документов нам сначала нужно создать коллекцию. Интересной особенностью базы данных NoSQL является то, что в отличие от базы данных SQL вам не нужно указывать имена столбцов или типы данных в ней.

Руководство по MongoDB (полная версия)

mongodb-logo

Приветствую! Меня зовут Евгений. На этом сайте я пишу о разработке программного обеспечения. Связаться со мной вы можете по email: proselytear@yahoo.com Имеет смысл, предварительно ознакомиться вот с этим FAQ разделом.

Недавние публикации
  • Механизмы CAS и FAA глазами Java разработчика
  • ExecutorService в Java и примеры его применения.
  • Особенности работы PreparedStatement в JDBC
  • Основы кэширования в Hibernate
  • Феномены чтения глазами разработчика

Copyright © 2023 PROSELYTE.

Omega WordPress Theme by ThemeHall

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *