newdeveloper
newdeveloper

Reputation: 1451

MongoDb: Convert date string to specific format in mongodb 3.6

I need to parse date value to specific format without using format field in dateFromString operator.

Mongo Playground

Current situation : in Mongodb 4.0 if I format dateString using below it code it give me mentioned output.

 parsedDate: {
        $dateFromString: {
          dateString: "$dateS",
          format: format: "%Y-%m-%dT%H"
        }
      }
Output: "parsedDate": ISODate("2020-01-16T08:00:00Z")

I cannot use format field in 3.6 since its not supported. How do I convert my date to format: "%Y-%m-%dT%H" in 3.6?

Upvotes: 1

Views: 1201

Answers (3)

newdeveloper
newdeveloper

Reputation: 1451

This worked for me: I used combined solution from @ambienBeing and @techstack. Thanks

Mongo playground

  "parsedDate": {
          "$dateFromParts": {
            "year": {
              "$year": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "month": {
              "$month": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "day": {
              "$dayOfMonth": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "hour": {
              "$hour": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            }
          }
        },

Upvotes: 0

techstack
techstack

Reputation: 998

I think following query will solve your problem because MongoDB 3.6 supports dateFromString

Input:

[
  {
    "dateS": "2020-01-16T08"
  }
]

Query:

db.collection.aggregate([
  {
    "$project": {
      "year": {"$substr": ["$dateS",0,4]},
      "month": {"$substr": ["$dateS",5,2]},
      "day": {"$substr": ["$dateS",8,2]},
      "hour": {"$substr": ["$dateS",11,2]}
    }
  },
  {
    $addFields: {
      "isoString": {
        "$concat": ["$year","-","$month","-","$day","T","$hour",":00:00Z"]
      }
    }
  },
  {
    $addFields: {
      "newDate": {
        $dateFromString: {"dateString": "$isoString"}
      }
    }
  }
])

Output:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "day": "16",
    "hour": "08",
    "isoString": "2020-01-16T08:00:00Z",
    "month": "01",
    "newDate": ISODate("2020-01-16T08:00:00Z"),
    "year": "2020"
  }
]

Upvotes: 1

ambianBeing
ambianBeing

Reputation: 3529

If I get the requirement right, Try the following query which uses: $dateFromParts

Input:

[
  {
    "date": ISODate("2020-01-16T08:54:17.604Z")
  }
]

Query:

db.collection.aggregate([
  {
    $project: {
      outputDate: {
        $dateFromParts: {
          "year": {
            $year: "$date"
          },
          "month": {
            $month: "$date"
          },
          "day": {
            $dayOfMonth: "$date"
          },
          "hour": {
            $hour: "$date"
          }
        }
      }
    }
  }
]);

O/P:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "outputDate": ISODate("2020-01-16T08:00:00Z")
  }
]

Playground Test Link

Upvotes: 1

Related Questions