Не нужно книжек и чтивы. Если работал с 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'ом ну и другими всякими плюшками.