Продолжение темы предыдущего поста - зачем мне все это? К примеру для того, чтобы вытащить документы коллекции MongoDB по дате создания. Возьмем коллекцию messages, созданную в одном из предыдущих постов. Отдельное поле, содержащее дату или timestamp отсутствует, однако дату создания документа можно получить по ObjectId.
Вспомним как выглядят документы коллекции messages:
Установим модуль mongodb, после чего напишем простенький модуль подключения к демону mongod по имени db.js:
Редактируем исходный код приложения, созданного в предыдущем посте: после middleware, которое просто выводит в консоль прилетевший в GET запросе параметр date, добавим маршрут '/messages', по которому будем отдавать документы одноименной коллекции, а в случае обнаружения параметра date отдавать документы старше прилетевшей в параметре даты.
Приведу код файла app.js целиком:
Напомню, что изначально приложение было создано с помощью express-generator за пару секунд.
Запускаем приложение, открываем в браузере адрес http://localhost:3000 и, как и ожидалось, получаем приветствие фреймворка Express.
Открываем http://localhost:3000/messages и получаем все документы коллекции messages:
Сорри, на скриншот весь массив не поместился :).
Возьмем _id одного из полученных документов, создадим ObjectId, вытащим из него дату создания и приведем к стандарту UTC:
Таким образом документы старше выбранного можно получить по адресу http://localhost:3000/messages?date=Sun, 31 Aug 2014 11:21:31 GMT:
Теперь на скриншоте весь массив :).
Профит очевиден, и получен с помощью одной единственной строки кода:
That's all folks :).
Вспомним как выглядят документы коллекции messages:
Установим модуль mongodb, после чего напишем простенький модуль подключения к демону mongod по имени db.js:
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
var db;
module.exports.connect = function() {
if (db) return db;
db = new Db('test', new Server('127.0.0.1', '27017', {auto_reconnect: true}), {w: 1});
db.open(function(err) { if (err) throw err; });
return db;
};
Редактируем исходный код приложения, созданного в предыдущем посте: после middleware, которое просто выводит в консоль прилетевший в GET запросе параметр date, добавим маршрут '/messages', по которому будем отдавать документы одноименной коллекции, а в случае обнаружения параметра date отдавать документы старше прилетевшей в параметре даты.
Приведу код файла app.js целиком:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(function(req, res, next) {
var date = req.query.date, timestamp, fromTimestamp;
if (!date) return next();
timestamp = Date.parse(date);
fromTimestamp = new Date(timestamp);
console.log('req.method: %s\ndate: %s\ntimestamp: %s\nfromTimestamp: %s\n', req.method, date, timestamp, fromTimestamp);
next();
});
var db = require('./db').connect();
var hex = require('mongodb').ObjectID.createFromHexString;
app.get('/messages', function(req, res, next) {
var query = {};
if (req.query.date) query._id = {$lt: hex(Math.floor(Date.parse(req.query.date)/1000).toString(16) + '0000000000000000')};
db.collection('messages').find(query).sort({_id: -1}).toArray(function(err, messages) {
if (err) return next(err);
res.json(messages);
});
});
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
Напомню, что изначально приложение было создано с помощью express-generator за пару секунд.
Запускаем приложение, открываем в браузере адрес http://localhost:3000 и, как и ожидалось, получаем приветствие фреймворка Express.
Открываем http://localhost:3000/messages и получаем все документы коллекции messages:
Сорри, на скриншот весь массив не поместился :).
Возьмем _id одного из полученных документов, создадим ObjectId, вытащим из него дату создания и приведем к стандарту UTC:
Таким образом документы старше выбранного можно получить по адресу http://localhost:3000/messages?date=Sun, 31 Aug 2014 11:21:31 GMT:
Теперь на скриншоте весь массив :).
Профит очевиден, и получен с помощью одной единственной строки кода:
...
if (req.query.date) query._id = {$lt: hex(Math.floor(Date.parse(req.query.date)/1000).toString(16) + '0000000000000000')};
...
That's all folks :).





Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации