Как получить результаты на основе текущей даты в MongoDB

#mongodb #mongodb-query #aggregation-framework #studio3t

Вопрос:

Как написать запрос или агрегацию в базе данных mongo, как показано ниже

 select * 
from final 
where Week=month(todaysdate()) "-" day(todaysdate()) "-" year(todaysdate()))
 

Комментарии:

1. Пожалуйста, покажите некоторые примеры данных.

2. Использовать moment.js библиотека. Было бы db.final.find({Week: moment().startOf('day').toDate()})

Ответ №1:

Предположим, что в базе данных имеется следующий документ:

 { "_id" : ObjectId("614ce00e6db392727c999e7f"), "Week" : "09-23-2021" }
 

Вот агрегация…

 db.collection.aggregate([
    {
        $project:
        {
            Week:
            {
                $dateFromString:
                {
                    dateString: "$Week",
                    format: "%m-%d-%Y"
                }
            }
        }
    },
    {
        $match: { $expr: { $eq: [ "$Week", { $dateFromParts: {"year": new Date().getFullYear(), "month": new Date().getMonth()   1, "day": new Date().getDate() } } ] } }
    }
])
 

Объяснение

Первый этап: $Project — интерпретируйте строку даты таким образом, чтобы мы могли использовать законный объект ISODate() для сравнения. Используйте выражение $dateFromString для преобразования текстовых данных поля в ISODate().

Второй этап: $Match — используйте оператор выражения $expr для сравнения переменной пути к полю $Week с текущей датой, составив дату без части метки времени. Сопоставьте и верните те, которые соответствуют равенству.

Осторожность

метод даты getMonth() всегда отключен на 1, как и ожидалось человеком. Январь-нулевой месяц. По этой причине, чтобы соответствовать вашей ожидаемой дате, в агрегацию добавляется строка a 1.

Допущения

  • Поле «Неделя» содержит строковые данные.
  • Формат данных в поле «Неделя»-ММ-ДД-ГГГГ.

Рекомендации

Храните данные о дате в виде ISODate (), а не в виде строки, затем используйте запрос диапазона для поиска элементов данных между двумя различными точками времени. Если вас интересует целый день, то диапазон должен составлять полночь на первое свидание (включительно) и полночь на второй день(эксклюзивно). Убедитесь, что у вас есть индекс в поле, чтобы запрос диапазона работал эффективно. Следите за вещами о часовых поясах. Монго любит хранить все в UTC.