X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Немного о MongoDB
alexdrob
alexdrob
Topic Starter сообщение 15.6.2011, 19:50; Ответить: alexdrob
Сообщение #1


Хотелось бы показать одну СУБД http://www.mongodb.org/
Это СУБД документо-ориентированная.
Все привыкли к MySQL и многие наверное и не догадываются что есть другие СУБД, в том числе те, которые вообще не имеют отношения к языку SQL.

С данной СУБД я познакомился не так давно, но она мне очень понравилась.
Плюсом я считаю простоту использования и быстроту работы.
Минусом - отсутствие например тех же JOIN'ов. Но всегда ли они нужны?

Ну небольшие куски кода с пояснениями:
[PHP]<?php
//Документ сохраняем в UTF-8 без BOM
//Что бы потом не было проблем с русским текстом

//Подключение
$m = new Mongo();

//Выбор БД
//Хотелось бы отметить что БД не нужно создавать явно
//Если БД с именем MyTestDB нет то она создатся сама.
$db = $m->MyTestDB;

//Выбор таблицы
$MyTable = $db->MyTable;
?>[/PHP]

Некоторые функции которые нам понадобятся
find() - выборка из таблицы
count() - сколько рядов в результате

Немного о find
Выборка как и вставка производится с помощью массивов.
например вы хотите выбрать всё:[PHP] $table->find();[/PHP]
хотите где поле title = PHP [PHP]$table->find( array('title' => 'PHP') );[/PHP]

Теперь по поводу данных в MongoDB.
Таблицы в MongoDB это не просто таблицы как в MySQL. Они могут содержать любые структуры.
Начнём с простых данных: поле -> значение.
Данные нужно передавать в виде ассоциативных массивов.

И так полный код примера:
[PHP]<?php
//Документ сохраняем в UTF-8 без BOM

//Подключение
$m = new Mongo();

//Выбор БД
//Хотелось бы отметить что БД не нужно создавать явно
//Если БД с именем MyTestDB нет то она создатся сама.
$db = $m->MyTestDB;

//Выбор таблицы
$MyTable = $db->MyTable;

//Если данных в таблице нет
//То добавим данные
if ($MyTable->find()->count() == 0)
{
//Вставка данных в таблицу
$row = array( 'title' => 'PHP', 'text' => 'какой-то текст' );
$MyTable->insert($row);
}

//Получаем данные из таблицы
$res = $MyTable->find();
//и выводим результат
foreach ($res as $value)
{
echo "<p>Заголовок: $value[title], Содержание: $value[text]</p>";
}

?>[/PHP]
Результат:
Заголовок: PHP. Содержание: какой-то текст.

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

На самом деле это не всё содержимое, MongoDB автоматически вставляет ID для каждого элемента. Его можно увидеть так.
[PHP]foreach ($res as $id => $value)
{
echo "<p>ID: $id, Заголовок: $value[title], Содержание: $value[text]</p>";
}[/PHP]

А теперь пример который вставит более сложный набор данных, например у нас есть блог, и для сообщения есть структура
Заголовок
Содержание
Теги {...}

Класс описывать не буду, покажу на примере обычного массива:
[PHP]<?php
//Документ сохраняем в UTF-8 без BOM

//Подключение
$m = new Mongo();

//Выбор БД
//Хотелось бы отметить что БД не нужно создавать явно
//Если БД с именем MyTestDB нет то она создатся сама.
$db = $m->MyTestDB;

//Выбор таблицы
$MyTable = $db->MyTable;

//Если данных в таблице нет
//То добавим данные
if ($MyTable->find()->count() == 0)
{
//Вставка данных в таблицу
$row = array( 'title' => 'PHP', 'text' => 'какой-то текст' );
$MyTable->insert($row);
}

//Если у нас нет сообщений блога
//То добавим данные
if ($MyTable->find()->count() == 1)
{
$row = array(
'title' => 'Сообщение из блога',
'text' => 'Текст нашего сообщения',
'tags' => array(
'php', 'mongodb'
)
);
$MyTable->insert($row);
}

//Получаем данные из таблицы
$res = $MyTable->find();
//и выводим результат
foreach ($res as $value)
{
echo "<p>Заголовок: $value[title]. Содержание: $value[text].";
if (!empty($value['tags']))
{
echo ' Теги: ' . implode(', ', $value['tags']) . '';
}
echo "</p>";
}

?>[/PHP]
Результат:
Заголовок: PHP. Содержание: какой-то текст.
Заголовок: Сообщение из блога. Содержание: Текст нашего сообщения. Теги: php, mongodb

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

PS хотелось бы отметить что результаты запроса выполняются очень быстро даже если вы будите в цикле использовать выборку то это врятли сильно замедлит работу скрипта. Я не призываю так делать :) Я просто хотел это отметить.
Для сравнения вывод 2х полей в 2х записях 1000 раз в цикле
MongoDB: 0.2030200958252
MySQL: 0.40911483764648
По крайней мере на моём стареньком AMD

Так как я предполагаю продолжить описание функций, я закрываю тему что бы не было флуда именно тут, есть претензии или вопросы пишите отдельно в теме :)
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 20.6.2011, 19:49; Ответить: alexdrob
Сообщение #2


Хорошая особенность MongoDB что не нужно заботиться о sql injection :)
А ещё вам не нужно создавать таблицы и описывать их поля. При первом обращении и сама БД и таблица и поля создадутся. при чём в любой момент напишите дополнительные поля и они добавятся.

Пример простейшей регистрации юзеров.
config
[PHP]<?php

//Инициализация сессий
session_start();

//Инициализация бд
$m = new Mongo();
//Выбор базы
$db = $m->SiteDB;

//Пользователь вошел?
function isLogin() {
return !empty($_SESSION['username']);
}

//Получаем имя пользователя
function getUserName() {
return empty($_SESSION['username']) ? '' : $_SESSION['username'];
}

//Закрываем странички
function Lock() {
isLogin() || exit('Нельзя смотреть!');
}

//Передана переменная action?
if (isset($_POST['action']) && isset($_POST['login']) && isset($_POST['password']) && !isLogin()) {
//Вызываем функцию в зависимости от action
switch ($_POST['action']) {
case 'reg' : newUser($_POST['login'], $_POST['password']); break;
case 'login' : loginUser($_POST['login'], $_POST['password']); break;
default : exit();
}
}

//Регистрация нового пользователя
function newUser($login, $password) {
global $db;
$login = htmlspecialchars($login);
//имя пользователя свободно?
if ($db->Users->find(array('login' => $login))->count() == 0) {
//добавляем пользователя
$db->Users->insert(array('login' => $login, 'password' => md5($password)));
//ну и сразу входим
$_SESSION['username'] = $login;
//и выведем сообщение что это всё таки была регистрация
echo '<div style="text-align: center">Регистрация прошла успешно!</div>';
} else {
//имя занято
echo '<div style="text-align: center">Имя недоступно!</div>';
}
}

//Авторизация
function loginUser($login, $password) {
global $db;
//пользователь найден?
if ($db->Users->find(array('login' => $login, 'password' => md5($password)))->count() == 1) {
//входим
$_SESSION['username'] = $login;
} else {
//и выведем сообщение что это данные не верны
echo '<div style="text-align: center">Не верный логин или пароль!</div>';
}
}

?>[/PHP]
index
[PHP]<?php

include "config.php";

//Если пользователь выполнил вход
if (isLogin()) {
//Выводим приветствие
?>

<div style="text-align: center">Добро пожаловать, <?php echo getUserName() ?>!</div>

<?php
//Если пользователь не выполнил вход
//Выводим форму входа/регистрации
} else {
?>

<form id="frmMain" style="margin: 0 auto; width: 200px;" method="post">
<fieldset> <legend>Логин</legend> <input type="text" name="login"/> </fieldset>
<fieldset> <legend>Пароль</legend> <input type="password" name="password"/> </fieldset>
<input type="hidden" id="action" name="action" value=""/>
<input type="submit" onclick="document.getElementById('action').value = 'reg'" value="Регистрация"/>
<input type="submit" onclick="document.getElementById('action').value = 'login'" value="Вход"/>
</form>

<?php } ?>[/PHP]
Ну и пример странички защищённой паролем
[PHP]<?php

include "config.php";

Lock();

?>

Тут секрет![/PHP]

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Немного статей
уникальных и полезных
6 mark2013 8879 14.4.2022, 15:31
автор: mark2013
Открытая тема (нет новых ответов) Требуется немного рерайта
но периодически...
2 GigArt 1057 12.1.2022, 12:45
автор: acw-895
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыОбмен перекрестный Новостник, сми, обо всём + немного женская тема - тиц 30, не заспамлен совсем, чистый.
8 anastasiaivan 12598 17.11.2017, 11:11
автор: maksut
Открытая тема (нет новых ответов) нужно немного изменить меню, Joomla, шаблон корпорейт респонс
1 MaxChemist 2068 7.3.2016, 15:06
автор: WorkingMan
Открытая тема (нет новых ответов) Продам немного сайтов (Builder, YouMoney, TravelGo, iBusiness, UniversalCredit)
3 LoraDi 2111 30.6.2015, 22:34
автор: LoraDi


 



RSS Текстовая версия Сейчас: 28.3.2024, 18:18
Дизайн