MongoDB / Mongoose запрос в определенную дату?

Можно ли запросить конкретную дату?

Я нашел в Поваренной книге монго, что мы можем сделать это для диапазона Querying для диапазона дат Как это:

db.posts.find({"created_on": {"$gte": start, "$lt": end}}) 

Но возможно ли конкретная дата? Это не работает:

 db.posts.find({"created_on": new Date(2012, 7, 14) }) 

6 Solutions collect form web for “MongoDB / Mongoose запрос в определенную дату?”

Это должно работать, если даты, которые вы сохранили в БД, не имеют времени (только год, месяц, день).

Скорее всего, датами, которые вы сохранили, была new Date() , которая включает в себя компоненты времени. Чтобы запросить это время, вам нужно создать диапазон дат, который включает все моменты в день.

 db.posts.find( //query today up to tonight {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}}) 

Для тех из нас, кто использует Moment.js

 var moment = require('moment') var today = moment().startOf('day') var tomorrow = moment(today).endOf('day') MyModel.find({ createdAt: { $gte: today.toDate(), $lt: tomorrow.toDate() } }) 

Важно: все моменты изменяемы !

tomorrow = today.add(1, 'days') не работает, так как он также мутирует today . Вызывающий moment(today) решает эту проблему, неявно клонируя today .

Да, объект Date задает дату и время, поэтому сравнение его с только значением даты не работает.

Вы можете просто использовать оператор $ where, чтобы выразить более сложное условие с помощью Javascript boolean expression 🙂

 db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' }) 

created_on – это поле datetime, а 2012-07-14 – указанная дата.

Дата должна быть точно в формате ГГГГ-ММ-ДД .

Примечание. Используйте $where экономно, это имеет последствия для производительности.

Ты пробовал:

 db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}}) 

Проблема, с которой вы столкнетесь, заключается в том, что даты сохраняются как отметки времени в Mongo. Итак, чтобы соответствовать дате, вы просите ее сопоставить временную метку. В вашем случае я думаю, что вы пытаетесь сопоставить день (т. Е. С 00:00 до 23:59 в определенную дату). Если ваши даты хранятся без разницы, тогда вы должны быть в порядке. В противном случае попробуйте указать дату в качестве диапазона времени в тот же день (т.е. start = 00: 00, end = 23: 59), если gte не работает.

аналогичный вопрос

Вы можете использовать следующий подход для метода API для получения результатов с определенного дня:

 # [HTTP GET] getMeals: (req, res) -> options = {} # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET) if req.query.date? date = new Date req.query.date date.setHours 0, 0, 0, 0 endDate = new Date date endDate.setHours 23, 59, 59, 59 options.date = $lt: endDate $gte: date Meal.find options, (err, meals) -> if err or not meals handleError err, meals, res else res.json createJSON meals, null, 'meals' 

У нас возникла проблема, связанная с дублированием данных в нашей базе данных, причем поле даты имеет несколько значений, где мы должны были иметь 1. Я думал, что добавлю способ решения проблемы для справки.

У нас есть коллекция под названием «данные» с полем «значение» и поле даты «дата». У нас был процесс, который, по нашему мнению, был идемпотентом, но в итоге он добавил 2 x значения в день во втором запуске:

 { "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")} { "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")} 

Нам нужно только 1 из 2 записей, поэтому пришлось прибегнуть к javascript, чтобы очистить db. Наш первоначальный подход состоял в том, чтобы перебирать результаты и удалять любое поле со временем между 6:00 и 11:00 (все дубликаты были утром), но во время реализации внесли изменения. Вот скрипт, используемый для его исправления:

 var data = db.data.find({"type" : "x"}) var found = []; while (data.hasNext()){ var datum = data.next(); var rdate = datum.date; // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better... if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") { if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) { print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date); } else { print("Removing " + datum._id); db.data.remove({ "_id": datum._id}); } } else { found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value; } } 

а затем запустил его с помощью mongo thedatabase fixer_script.js

Interesting Posts

Изменение размера изображения CSS и сохранение пропорций

Как превратить сотни текстовых URL в Excel в интерактивные гиперссылки?

«Недавно закрытые вкладки» в новой бета-версии Google Chrome?

Как эффективно перебирать каждую запись на «карте»?

Spring 3 MVC: один-ко-многим в динамической форме (добавление / удаление при создании / обновлении)

Вывод признака приводит к непредвиденной ошибке компилятора, но ручная реализация

Как обнаружить события click / touch в пользовательском интерфейсе и GameObjects

Изменение новой страницы вкладки Chrome в локальном файле

Как создать панель пользовательских оценок в Android

Почему статические переменные считаются злыми?

В ClearCase, как я могу просмотреть старую версию файла в статическом представлении из командной строки?

Совместное использование или синхронизация домашних папок между компьютерами Mac

Как изменить высоту UIPickerView

Исправить поврежденный драйвер AHCI Driver

Прокрутка Magic Mouse на Windows 8

Давайте будем гением компьютера.