MongoDB – Stepan Suvorov Blog https://stepansuvorov.com/blog Release 2.0 Sun, 22 Jan 2017 08:52:46 +0000 en-US hourly 1 https://wordpress.org/?v=6.3.1 oyao.ru – О Я Ору! https://stepansuvorov.com/blog/2015/03/oyao-ru-%d0%be-%d1%8f-%d0%be%d1%80%d1%83/ https://stepansuvorov.com/blog/2015/03/oyao-ru-%d0%be-%d1%8f-%d0%be%d1%80%d1%83/#respond Wed, 04 Mar 2015 19:43:37 +0000 http://stepansuvorov.com/blog/?p=1688 Continue reading ]]> oyao.ru logo

Позвольте представить вашему вниманию мой проектик “О Я Ору“. Идея появилась еще 5 лет назад , когда не было демотиваторов (таких, которые мы знаем сейчас) да и никто не понимал, зачем постить текст нарисованный на картинке, когда можно запостить просто текст. Думаю, я был вдохновлен идеей nah.ru и просто решил ее расширить. Нет, не ругательства расширить – саму идею расширить: это может быть доброе приветливое сообщение. Но смысл: не написать это текстом, смысл кинуть ссылку (ну либо запостить в соц сети) на рисунок с этим текстом, чтобы придать ей больший эмоциональный оттенок.

Сообщения могли бы быть начиная от “не забудь купить молоко”, “просыпайся” и заканчивая понравившимися цитатами древних философов.

Сейчас уже существует много подобных сайтов и я не претендую на новизну и оригинальность. Приложение было создано скорее для того, чтобы разобраться как работает сервис heroku на каком-то более не менее реальном примере. Действительно очень удобно: просто создаем удаленный репозиторий heroku и делаем туда git push. Инструкции по установке и запуску сервера прописываем в package.json.

Еще поигрался с canvas и заставил его конвертировать кусок HTML в png файл, а потом этот png файл декодить и сохранять в mongodb (кстати она тоже предоставляется heroku либо партнерским сервисов).

Так же пришлось разобрать OG протокол, чтобы фейсбук правильно понимал картинку, которую нужно отображать в превью. Но, так как подлый фейсбук все равно отображал не очень правильно – я пошел дальше и распарсил хедер его бота и скармливаю ему картинку, вместо html.

Весь стек использованных технологий: AngularJS, Restangular, node.js, express, mongodb.

Так как и база и сам хостинг бесплатны – они прилично протормаживают. Это большой минус бесплатного heroku.

Большая часть цитат, которые вы можете видеть были тщательно отобраны и записаны мной в процессе тестирования приложения.

Приятного использования.

oyao.ru example

]]>
https://stepansuvorov.com/blog/2015/03/oyao-ru-%d0%be-%d1%8f-%d0%be%d1%80%d1%83/feed/ 0
Mongoose для MongoDb https://stepansuvorov.com/blog/2012/11/mongoose-%d0%b4%d0%bb%d1%8f-mongodb/ https://stepansuvorov.com/blog/2012/11/mongoose-%d0%b4%d0%bb%d1%8f-mongodb/#comments Tue, 27 Nov 2012 20:14:01 +0000 http://stepansuvorov.com/blog/?p=761 Continue reading ]]>

Mongoose – это ORM для MongoDb сделанная под node.js.

Традиционно начнем разбор с создания песочницы.

Mongoose устанавливается как модуль к node.js:

$ npm install mongoose

После установки проверяем подключается ли модуль, пишем в test.js файлик следующий код:

var mongoose = require('mongoose');
console.log(mongoose.version);

и если все прошло успешно, то должно выдать текущую версию mongoose.

Чтобы подключится к базе, создаем соединение:

var db = mongoose.createConnection('mongodb://localhost/test');
//общий синтаксис метода createConnection выглядит слудеющим образом:
//mongoose.connect('mongodb://username:password@host:port/database').

и открываем его:

db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function callback () {
    console.log("Connected!")
});

В mongoose все завязано на 2х ключевых понятиях Схема(Schema) – описание сущности и Модель – сама сущность.

Создадим схему для комментариев:

var UserSchema = new mongoose.Schema( {
    name: { type: String, default: "hahaha" },
    age: { type: Number, min: 18, index: true },
    bio: { type: String, match: /[a-z]/ },
    date: { type: Date },
    buff: Buffer
} );

Каждое поле карактеризуется типом SchemaTypes и может иметь дополнительные характеристики: default, min и max(для Number), match и enum(для String), index и unique(для индексов).

Подробнее о типах можно почитать тут.

Теперь создадим модель по схеме:

var User = db.model("User",UserSchema)

и экземпляр для данной модели:

var newUser = new User({ name: "Alice", age: 21})

мы можем расширить схему методами:

UserSchema.methods.speak = function () {
    var greeting = this.name
        ? "My name is " + this.name
        : "I don't have a name"
    console.log(greeting);
}

var User = db.model("User",UserSchema)
var newUser = new User({ name: "Alice", age: 21})
newUser.speak();

Чтобы сохранить нашего пользователя в базу, мы должны вызвать метод save:

newUser.save(function (err, newUser) {
    if (err){
        console.log("Something goes wrong with user " + newUser.name);
    }else{
        newUser.speak();
    }
});

Посмотреть что мы насохраняли в базу и вывести записи для конкретной коллекции(модели) можно так:

User.find(function (err, users) {
        console.log(users)
    })

если нам необходимо добавить условие для выборки, тогда так:

User.find({ name: /^Al/ }, function (err, users) {
        console.log(users)
    })
// также существует метод findById

Кроме обычных методов схема позволяет добавлять сеттеры и геттеры (магические методы):

UserSchema.path("name").set(
    function( name ) {
        //capitalize
        return name.charAt(0).toUpperCase() + name.slice(1);
});
var newUser = new User({ name: "alice"})  //  name will be capitalize

Кроме set мы еще можем задать get и default магические методы.

Также схема позволяет на каждый метод повесить триггер с колбэком, который будет выполнен до выполенения самого метода. Такой удобный механизм, который позволяет избежать большой вложенности, в MongoDb называется Middleware.

Реализуется следующим образом:

someSchema.pre(methodName,
    function (next, methodArg1, methodArg2, ...) { 
        // ...
    })

как пример возмем метод save:

UserSchema.pre( "save",
    function( next ) {
        // do stuff
        next();
    } );

по next() запускается следующий триггер.

Используя данный подход мы можем организовать механизм вызова и передачи ошибок:

UserSchema.pre('save',
         function (next) {
             // something goes wrong
             next(new Error('something went wrong'));
});
// later...
newUser.save(function (err) {
    // err can come from a middleware
});

Также с помощью Middleware можно делать:

  • сложную валидацию
  • удаление документов по зависимостям
  • вызов кастомизированых событий
  • нотификейшены
*Вероятно статья будет дополнена псевдоджоинами и parallel middleware
]]>
https://stepansuvorov.com/blog/2012/11/mongoose-%d0%b4%d0%bb%d1%8f-mongodb/feed/ 2
Репликация MongoDb быстрая настройка https://stepansuvorov.com/blog/2012/11/%d1%80%d0%b5%d0%bf%d0%bb%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-mongodb-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0/ https://stepansuvorov.com/blog/2012/11/%d1%80%d0%b5%d0%bf%d0%bb%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-mongodb-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0/#comments Tue, 27 Nov 2012 15:34:01 +0000 http://stepansuvorov.com/blog/?p=757 Continue reading ]]>

MongoDb поддерживает 2 формы репликации: реплисеты(Replica Sets ) и ведущий-ведомый(Master-Slave). Рекомендуется использовать более новый подход – реплисеты.

О реплисетах  можно подробно прочесть на официальном сайте. Мы в свою чередь разберем как можно быстро создать и настроить данный вид репликации.

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

Создадим несколько директорий для экспериментальных баз:

$ mkdir db1
$ mkdir db2
$ mkdir db3

Запуск демона MongoDb (mongod) выполняется следующей командой

$ mongod

если хотим указать путь к базе и порт, тогда так:

$ mongod --dbpath db1 --port 27001

плюс добавим еще параметр указывающий на то что это репликасет:

$ mongod --dbpath db1 --port 27001 --replSet myreplica

myreplica – в данном случае имя для нашего репликасета.

Теперь таким же образом запускаем еще 2 демона:

$ mongod --dbpath db2 --port 27002 --replSet myreplica
$ mongod --dbpath db3 --port 27003 --replSet myreplica

В итоге у нас подготовлены 3 базы и нам следует теперь распределить между ними роли: кто будет Первичным(Primary) звеном, к которому будут добавлены остальные.

Допустим мы решили сделать db1 главным. Для этого заходим на него используя mongoshell :

$ mongo --port 27001

и делаем

mongo> rs.initiate()

для инициализации конфигурации.

Все манипуляции с репликасетом выполняются с помощью методов объекта rs. Весь список методов пожно получить выполнив команду rs.help().

Проверим статус нашего репликасета:

mongo> rs.status()

как видим в свойстве members присутсвует только текущий сервер, для того чтобы добавить остальные делаем:

mongo> rs.add("myhost:27002")
mongo> rs.add("myhost:27003")

myhost – имя нашего хоста (должно быть написано при выводе rs.status())

Выволним еще раз rs.status() и убедимся что базы были добавлены.

Вот и все. Старался передать материал максимально просто. За более полной информацией по конфигурированию можно обратиться к офсайт докам.

]]>
https://stepansuvorov.com/blog/2012/11/%d1%80%d0%b5%d0%bf%d0%bb%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-mongodb-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0/feed/ 3
Песочница для mongodb https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/ https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/#comments Sat, 10 Nov 2012 20:21:22 +0000 http://stepansuvorov.com/blog/?p=728 Continue reading ]]> Проходя курсы по mongoDb остро стала необходимость в организации какой-то песочницы для скриптов, так как просто в mongoshell писать стало не удобно, а отдельно писать в редакторе код, а потом его запускать через консоль – тоже не интересно.

Покопавшись в плагинах WebStorm (который является моим текущим IDE), я обнаружил, что для mongoDb расширения, увы, еще нет. Ну что же, играем дальше. Есть плагин на node.js, который довольно просто настраивается. После чего можем в настройках запуска проекта

добавить вариант запуска текущего скрипта нодой.

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

Итак, у нас есть удобный редактор, подключенная нода и консольный вывод в самом редакторе. Осталось только накидать код:

var mongo = require('mongodb');
var host = 'localhost';
var port = mongo.Connection.DEFAULT_PORT;

var db = new mongo.Db('test', new mongo.Server(host, port, {}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");

    // а вот тут и пишем наш код, который хотим отладить

    db.close();
});

Happy codding!

]]>
https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/feed/ 1
Node.js и MongoDB https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/ https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/#comments Tue, 16 Oct 2012 06:41:24 +0000 http://stepansuvorov.com/blog/?p=677 Continue reading ]]>

Попробуем подружить MongoDB и Node.js.

Договоримся что нода у нас уже стоит, если нет идем по тегу Node.js, и разбираемся, а потом возвращаемся сюда доставлять mongoDB.

Чтобы поставить MongoDB на Ubuntu(12.04) выполняем следующую команду:

$ apt-get install mongodb

Чтобы проверить правильно ли поставилось запускаем:

$ /usr/bin/mongo

Должно зайти в программу и выдать что-то типа:

MongoDB shell version: 2.0.4
connecting to: test

Далее устанавливаем дополнительный пакет на ноду:

$ npm install mongodb

если мы будем использовать во всех проектах монго, то имеет смысл поставить флажок -g “для всех”:

$ npm install mongodb -g

!Внимание. Предварительно может потребовать установить пакет node-gyp.

$ npm install node-gyp -g

Есть. Проверим через простой скрипт test.js установился ли модуль, содержание:

var mongo = require('mongodb');

Выполняем:

$ node test.js

Если ошибок не выдало, можно еще немного расширить наш скрипт:

var mongo = require('mongodb');
var host = 'localhost';
var port = mongo.Connection.DEFAULT_PORT;

var db = new mongo.Db('test', new mongo.Server(host, port, {}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");
    db.close();
});

– создали объект базы, подключились к базе, закрыли соединение.

Немного расширим наш скрипт, добавим запись и чтение информации из базы:

...
var db = new mongo.Db('test', new mongo.Server(host, port,{}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");

    var collection = db.collection("simple_collection");
    collection.insert({hello:'world'});

    collection.findOne({hello:'world'}, function(err, item) {
        console.log(item);
        db.close();
    })

});

Чтобы добавить несколько записей можно сделать так:

collection.insert([{hello:'world'}, {hello:'world2'}, {hello:'world3'}]);

Думаю будет еще один пост непосредственно о использовании MongoDB, а в этом пока все.

]]>
https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/feed/ 1