Период времени фильтра в node.js - PullRequest
0 голосов
/ 17 апреля 2020

модель. js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const user = new Schema ({
id:{type:mongoose.Types.ObjectId},
firstName:{type:String, required:true},
lastName:{type:String, required:true},
pic:{type:String},
gender:{type:String},
dob:{type:String},
maritalStatus:{type:String},
nationality:{type:String, enum: ['Indian', 'Others']},
streetAddress: {type:String},
city: {type:String},
state: {type:String},
postalCode: {type:String},
country: {type:String},
phone: {type: String},
email: {type:String},
jobTitle: {type:String},
department: {type:mongoose.Schema.Types.ObjectId, ref:'department'},
dateOfJoining: {type:String},
employeeStatus: {type:String, enum: ['Working', 'Resigined', 'Terminated']},
kra: {type:String},
assignedSupervisor: {type:String},
assignedSubordinate: {type:String},
workExperience : {type:String},
skills: {type:String},
password: {type:String, required:true},
createdOn : {type:Date, default:Date.now}  <<<<=====   filter will work on this
})

 module.exports = mongoose.model("user", user);

запрос. js

exports.getUser = async(userId, employeeStatus, department, firstName, timePeriod) => {
if (timePeriod) {
    if (timePeriod = 'today') {
       ====>>>>>>> I want here if req.query.timeperiod = today then it show result whose createdOn is today. createdOn is the field in user schema given above 
    }

}
let queryFilters = { employeeStatus, department, firstName, timePeriod}
queryFilters = JSON.parse(JSON.stringify(queryFilters));
console.log(queryFilters)
return await model.find(queryFilters).populate("department").exec();
}

обработчик. js

getUser = async (req, res, next) => {
try {
    let user = await userController.getUser(req.query.employeeStatus, req.query.department, req.query.firstName, req.query.timePeriod)
    req.data = user
    next()
}
catch (e) {
    req.status = 400;
    next(e)
}
}

Запрос работает нормально. Я хочу, если req.query.timePeriod = today, тогда запрос. js должен возвращать результат, для которого selectedOn имеет сегодняшнюю дату. madeOn - это поле, как видно из модели. js. Я застрял здесь. Может кто-нибудь помочь мне?

1 Ответ

0 голосов
/ 17 апреля 2020

Даже если год-месяц-дата совпадает, но время, когда документ создан и ввод не совпадает, вы можете сделать это, используя $ dateToString из агрегации, которая преобразует поле даты в БД до "% Y-% m-% d" формат:

{
    $match: {
      $expr: {
        $eq: [
          {
            $dateToString: {
              format: "%Y-%m-%d",
              date: "$createdOn"
            }
          },
          "2020-04-17" /** Input */
        ]
      }
    }
  }

Тест: MongoDB-Playground

Примечание: Все даты в MongoDB хранятся в UT C. Итак, когда вы говорите сегодня , тогда строка, взятая для ввода "2020-04-17" , должна относиться к UT C. Скажем, когда вы добавите документ около 23:00 CST (центральное время в США) 17 апреля 2020 года, тогда createdOn документа будет 18 апреля, так как UT C опережает CST , аналогично, когда вы делаете это с IST в 1:00 18 апреля, тогда документы createdOn будут 17 апреля, потому что UT C отстает IST . Таким образом, в вашем node.js коде вы можете сделать что-то вроде new Date().toISOString().split('T')[0], чтобы получить UT C конвертированную дату. Если вам не нужны эти преобразования, возможно, вы можете хранить в документах только строки, подобные этой "2020-04-17" . Если вам интересно, как использовать .populate с .aggregate(), проверьте это: * как использовать-заполнить-и-агрегировать-в-том-же-утверждении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...