Home > Software design >  MongoDB - Query with date range and other field
MongoDB - Query with date range and other field

Time:01-25

I have the following documents in my collection:

[
    {"date_time": "2022-11-05 09:09:55", "dat1": "TRUI", "cod": "XC"}
    {"date_time": "2022-11-21 09:09:55", "dat1": "TRQW", "cod": "KL"}
    {"date_time": "2022-12-06 09:09:55", "dat1": "CBTR", "cod": "NM"}
    {"date_time": "2022-12-18 09:09:55", "dat1": "METR", "cod": "XC"}
]

So, I'd like to query my collection to get all documents with the conditions "cod": "XC" and "date_time" between 2022-11-01 to 2022-12-31. The result would be:

[
    {"date_time": "2022-12-18 09:09:55", "dat1": "METR", "cod": "XC"}
    {"date_time": "2022-11-05 09:09:55", "dat1": "TRUI", "cod": "XC"}
]

How can I achieve the result?

CodePudding user response:

As the date_time field is a String type, you need to convert it from String to DateTime type via $dateFromString operator. The operator is an aggregation operator, thus you need the $expr operator.

db.collection.find({
  $expr: {
    $and: [
      {
        $eq: [
          "$cod",
          "XC"
        ]
      },
      {
        $and: [
          {
            $gte: [
              {
                $dateFromString: {
                  dateString: "$date_time",
                  format: "%Y-%m-%d %H:%M:%S"
                }
              },
              ISODate("2022-11-01T00:00:00Z")
            ]
          },
          {
            $lte: [
              {
                $dateFromString: {
                  dateString: "$date_time",
                  format: "%Y-%m-%d %H:%M:%S"
                }
              },
              ISODate("2022-12-31T00:00:00Z")
            ]
          }
        ]
      }
    ]
  }
})

Demo ($dateFromString) @ Mongo Playground


As it is a field for storing date, would suggest storing the value as DateTime type. This will simplify and optimize your query without need to perform the data conversion.

db.collection.find({
  cod: "XC",
  date_time: {
    $gte: ISODate("2022-11-01T00:00:00Z"),
    $lte: ISODate("2022-12-31T00:00:00Z")
  }
})

Demo @ Mongo Playground

  • Related