Тема: 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_reconnecttrue });

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

users.find({ }).toArray(function(errdata) {
  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} }, { new: true }, function(errid) {
      if (
    err) throw err;

      
    // id == твой новый id
    }); 
  • find получает список, и в mongo-native модуле это не callback (это единственный метод с таким исключением). Так что юзаем спец модуль "toArray":
    users.find({ }).toArray(function(errdata) {
      
    }); 
  • Для REST советую использовать express.js т.к. роутинг будет очень простым и удобным.
  • Валидация - важно. Типы данных бывают разные (если это POST).
  • Middleware - в express есть отличная тема с middeware, так можно написать модуль с парсингом пагинации и юзать его везде. Пример: заводим файл pagination.js и его содержимое:
    exports.middleware = function(data) {
      return function(
    reqresnext) { // возвращаем 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(limitdata.max); // ограничиваем limit
        
    }
        if (
    data.min) { // если указано минимальное число на страницу
          
    limit Math.max(limitdata.min); // ограничиваем limit
        
    }

        
    req.paginator = { // создаём объект с limit и skip данными в объекте запроса
          
    limitlimit,
          
    skipskip
        
    };
        
    next(); // продолжаем цепочку middleware
      
    }
    }; 
    Далее в коде:
    var paginator = require('./paginator.js').middleware// получаем handle middleware пагинатора
    app.get('/users'paginator({
      
    limit8,
      
    min4,
      
    max64
    }), function(reqresnext) { // устанавливаем get запрос с пагинатором
      
    users.find({ }, { skipreq.paginator.skiplimitreq.paginator.limit }).toArray(function(errdata) { // ищем в бд с данными из пагинатора
        
    if (errnext(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)