Тема: Node.JS + MongoDB
Показать сообщение отдельно
Старый 01.09.2013, 22:00   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Node.JS + MongoDB

Не нужно книжек и чтивы. Если работал с mongo то там всё проактически идентично официальным докам (в случае с mongoose это не так).
Я юзал mongoose и потом перешёл на mongo-native от самих 10gen - и не жалею вовсе. Мне эти schemas - нафиг не сдались. Суть mongo - в её динамике, и нефиг пытаться прикручивать правила и структуру к collection'ам подобно это SQL бд.

Офф дока - очень полезна, т.к. как уже говорил почти идентична к mongo-native в использовании.
По факту - коммандная строка для mongo тоже на JavaScript'е

Про соединение, сперва тебе нужно создать объект куда коннектиться:
var mongodb = require('mongodb');
var 
access = new mongodb.Server('127.0.0.1', 27017, { auto_reconnect: true });

new 
mongodb.Db('database', access, { safe: true }).open((function (err, db) {
  if (
err) throw err;
  
// db - хендл для бд (client)
}); 
Далее тебе нужно будет получить сами collection'ы, я это делаю один раз при коннекте в самом каллбеке (точнее я создаю евент и слущаю его, таким образом разные модули получают свои collection'ы:
var users = db.collection('users'); 
Как только у тебя есть collection можешь уже работать с данными:
users.insert({ name: 'test' });

users.find({ }).toArray(function(err, data) {
  if (
err) throw err;

  
console.log(data);
}); 
Вот тут исчерпывающие примеры:
https://github.com/mongodb/node-mong...aster/examples

Есть пару тонкостей:
  • Реконнект при обрыве с бд, я не тестировал, но может даже collection хэндлы нужно будет переполучать (а может и нет). В общем тестируй если такие сценарии бывают.
  • _id - по стандарту mongo держит ObjectID - это своего рода просто string и в консоль по факту будет выводиться просто как string что пиздецки сбивает порой. Так что не забывай что каждый раз если имеешь ID например с REST запроса, нужно создать ObjectID объект из string'и.
  • Если хочешь просто номер для _id (не рекомендуется если предполагается шардинг или репликация бд). То у меня был очень простой выход: заводим collection 'ids' и имеем _id - имя collection и inc - число инкремента. Затем если хотим создать объект в бд делаем:
    ids.findAndModify({ _id: 'users' }, { }, { $inc: { inc: 1 } }, { new: true }, function(err, id) {
      if (
    err) throw err;

      
    // id == твой новый id
    }); 
  • find получает список, и в mongo-native модуле это не callback (это единственный метод с таким исключением). Так что юзаем спец модуль "toArray":
    users.find({ }).toArray(function(err, data) {
      
    }); 
  • Для REST советую использовать express.js т.к. роутинг будет очень простым и удобным.
  • Валидация - важно. Типы данных бывают разные (если это POST).
  • Middleware - в express есть отличная тема с middeware, так можно написать модуль с парсингом пагинации и юзать его везде. Пример: заводим файл pagination.js и его содержимое:
    exports.middleware = function(data) {
      return function(
    req, res, next) { // возвращаем middleware функцию
        
    var limit = data.limit ? data.limit : 0; // limit по стандарту 0
        
    var skip = 0; // skip тоже нуль

        
    if (req.query.limit) { // если в запросе есть limit
          
    var tmp = parseInt(req.query.limit); // парсим
          
    if (tmp != NaN && tmp > 0) { // если хорошее число
            
    limit = tmp;
          }
        }
        if (
    req.query.skip) { // если в запросе есть skip
          
    var tmp = parseInt(req.query.skip); // парсим
          
    if (tmp != NaN && tmp > 0) { // если хоршее число
            
    skip = tmp;
          }
        }

        if (
    data.max) { // если указан максимальное число на страницу
          
    limit = Math.min(limit, data.max); // ограничиваем limit
        
    }
        if (
    data.min) { // если указано минимальное число на страницу
          
    limit = Math.max(limit, data.min); // ограничиваем limit
        
    }

        
    req.paginator = { // создаём объект с limit и skip данными в объекте запроса
          
    limit: limit,
          
    skip: skip
        
    };
        
    next(); // продолжаем цепочку middleware
      
    }
    }; 
    Далее в коде:
    var paginator = require('./paginator.js').middleware; // получаем handle middleware пагинатора
    app.get('/users', paginator({
      
    limit: 8,
      
    min: 4,
      
    max: 64
    }), function(req, res, next) { // устанавливаем get запрос с пагинатором
      
    users.find({ }, { skip: req.paginator.skip, limit: req.paginator.limit }).toArray(function(err, data) { // ищем в бд с данными из пагинатора
        
    if (err) next(err); // если ошибка, бежим в express хэндлер ошибок
        
    res.json(data); // или шлём данные с бд джонсоном
      
    });
    }); 

Если есть конкретные вопросы - задавай.
Я пишу по работе RESTful API с mongo-native и express'ом ну и другими всякими плюшками.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Lestar (05.09.2013), pax (02.09.2013), SpiritSound (28.11.2015)