#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.