Поле timestamp
в вашей коллекции имеет строковый тип, напоминающий строчную метку даты ISO. Запрос, безусловно, не будет работать, потому что вы будете сравнивать две совершенно разные строки (в зависимости от длины поле timestamp
имеет больше символов, чем значение параметра datetime
req).
Было бы гораздо проще, если бы вы были включить еще одно поле в вашем документе схемы, которая на самом деле представляет собой дату:
db.collection.find().forEach(function (doc){
doc.created_on = ISODate(doc.timestamp);
db.collection.save(doc);
});
Вы можете использовать запрос диапазона для поиска документов, чье значение для created_on
поле больше, чем объект Date, представляющий начало дня переменной datetime
, и меньше объекта Date, представляющего конец переменной дня datetime
.
Сначала вам нужно построить объекты Date, представляющие начало и конец дня datetime
. Например:
var datetime = "2015-04-14",
start = new Date(datetime),
dateParts = datetime.split('-'),
y = parseInt(dateParts[0], 10),
m = parseInt(dateParts[1], 10),
d = parseInt(dateParts[2], 10),
end = new Date(y, m-1, d+1);
console.log(start.toISOString()); // "2015-04-14T00:00:00.000Z "
console.log(end.toISOString()); // "2015-04-15T00:00:00.000Z"
В вашем Экспресс код вы можете изменить его, чтобы отразить выше:
router
.param('datetime', function (req, res, next) {
var start = new Date(req.params.datetime),
dateParts = datetime.split('-'),
y = parseInt(dateParts[0], 10),
m = parseInt(dateParts[1], 10),
d = parseInt(dateParts[2], 10),
end = new Date(y, m-1, d+1);
req.dbQuery = {"created_on": { $gte: start, $lt: end }};
next();
})
.route('/expences/:datetime')
.get(function (req, res) {
var collection = db.get('memberExpences');
collection.find(req.dbQuery , function (err, data) {
res.json(data);
});
});
Обратите внимание на использование специальных $
операторов, $gte
(больше или равно) и $lt
(меньше), которые используются для выполнения запроса диапазона для получения соответствующих документов.
Использование MomentJS:
var start = moment("2015-04-14").format();
var end = moment(start).add('days', 1);
db.collection.find({"created_on": {"$gte": start, "$lt": end}});
EDIT
В узле, водитель Монго даст вам строку ISO, а не объект, таким образом, если вы хотите, чтобы включить дополнительный created_on
поле ваш документ просто добавьте новое поле с текущим значением даты. Например:
.post(function (req, res) {
var date = new Date();
var expence = req.body;
expence["created_on"] = date;
var collection = db.get('memberExpences');
collection.insert(expence, function (err, data) {
res.json(200);
});
});
Благодарим за такой подробный ответ. Я все понял, просто не понял, как создать поле «created_on». Так как я генерации с использованием этой функции ------- .post (функция (Req, Рез) { \t \t \t \t \t вар дата = новая дата(); \t \t \t \t \t вар засчёт = req.body ; \t \t \t \t \t expence.timestamp = дата; \t \t \t \t \t коллекция вар = db.get ('memberExpences'); \t \t \t \t \t collection.insert (засчёт, функция (ERR, данные) {\t \t \t \t \t \t res.json (200); \t \t \t \t \t}) \t \t \t}); --------- Как вставить дату в поле 'created_on' – rajat
@anonymousrajat Спасибо. Я только что обновил свой ответ, чтобы ответить на другой вопрос. Я также понял, что строка, которую вы получаете из поля timestamp в узле, представляет собой строку ISO, а не объект ISODate, но если вы запрашиваете в оболочке Mongo, она покажет вам тип как ISODate. Таким образом, способ создания поля timestamp - правильный путь, только в драйвере mongo он представлен как строка ISO. – chridam
Это сработало. Спасибо @chridam. Но у меня есть один вопрос, почему в конце = новая дата (y, m-1, d + 1) есть -1 с 'm'. d + 1 отлично, но y m-1 – rajat