Search code examples
node.jsmongodbexpressdaterestful-url

Express/MongoDB date formatting to match req.params to date in mongo document


I have a MongoDB collection (SlopeDay) that has dates stored.

enter image description here

In my express routing, I'm looking to format the date to MM-DD-YYYY so that I can use that for the URL. That URL will find all documents with matching dates AND matching resortNames.

dateRouter.get("/:formattedDate", (req, res) => {
  const formattedDate = req.params.formattedDate;

  SlopeDay.find({}) // isolate dates
    .then((dateObj) => {
      dateObj.forEach((date, i) => {
        let dateStr =
          // MM-DD-YYYY reformatting to string
          ("0" + (date.date.getMonth() + 1)).slice(-2) +
          "-" +
          ("0" + date.date.getDate()).slice(-2) +
          "-" +
          date.date.getFullYear();
         // map below doesn't seem to be doing much
        const objWithFormattedDate = dateObj.map((obj) => {
          return { ...obj, formattedDate: dateStr, isNew: true };
        });
        // console.log(objWithFormattedDate);
      });
    });
});

I'm at a loss for how to do this properly. I need the get route to access all SlopeDay documents matching dates to the MM-DD-YYYY parameter URL.


Solution

  • I'm able to get it working by breaking the strings up and querying that way:

    dateRouter.get("/:formattedDate", (req, res) => {
      const formattedDate = req.params.formattedDate;
    
      // break up the date
      const targetChars = formattedDate.substring(3, 5);
      const beforeTargetChar = formattedDate.substring(0, 3);
      const afterTargetChar = formattedDate.substring(5);
    
      // create lower and upper boundaries that straddle the formatted date
      const lowerbound = beforeTargetChar + (targetChars - 1) + afterTargetChar;
      const upperbound =
        beforeTargetChar + (Number(targetChars) + 1) + afterTargetChar;
    
      SlopeDay.find({
        date: {
          // find docs with dates between the boundaries (THIS SHOULD EQUAL req.params.formattedDate)
          $gte: new Date(lowerbound),
          $lt: new Date(upperbound),
        }, // add 2nd query here
      }).then((dateData) => res.send(dateData));
    });