dateFromString not covering valid date - mongodb

I am trying to covert a date in Mongo. We are not yet on 4.0 so I have to use dateFromString.
My date is stored is a valid date: "2019-02-05T03:38:52.441Z"
I can do this on my local 4.0.6 and this works great!
{ $toDate: "$eventTime" }
but I need to run this on an older version of Mongo.. and I changed to this:
{ $dateFromString: { dateString: "$eventTime" }}
I get the following error:
"$dateFromString requires that 'dateString' be a string, found: date with value 2019-02-05T03:38:52.441Z"
Looks like a valid date to me... any ideas? Other than upgrading Mongo :)

I had to add this to my test data:
var ISODate = require('isodate');
ISODate("2019-08-13T17:54:00.800Z"),

Related

MongoDB: Migrate some YYYY-MM-DD dates to ISO 8601

I have a field with dates stored in different formats (due to a code change at some point):
Some documents in the same collection use ISO 8601 ("2022-06-27T00:00:00.000Z"), while some others use the YYYY-MM-DD syntax ("2022-06-27").
This is a problem, because this query fails to fetch the YYYY-MM-DD documents (while it does fetch the ISO ones):
filter:
{"where":{"and":[{"notificationOfNeedDate":{"gte":"2019-04-08T21:00:00.000Z"}}]},"order":["aCode DESC"],"limit":24,"skip":0}
I believe the solution is to migrate all YYYY-MM-DD to ISO dates
Is there a command to run in mongodb in order to "UPDATE" all YYYY-MM-DD to ISO dates (for that collection and field), respecting the locale timezone offset and the DST settings for that day?
Thanks
Another example why date values should never be stored as string, it's a design flaw. Store always proper Date objects, so you go in the right direction.
Your question is not really clear, string "YYYY-MM-DD" is also a valid format according to ISO 8601 (a date, just without time information).
You can use $dateFromString:
db.collection.updateMany(
{ timestamp: { $type: "string" } },
[ {
$set: {
notificationOfNeedDate: {
$dateFromString: {
dateString: '$notificationOfNeedDate',
timezone: 'Europe/Athens'
}
}
}
} ]
)
You don't need to specify format, because ISO-8601 format is the default.
Then in your query you need to filter also on Date values:
db.collection.find({ notificationOfNeedDate: { $gte: ISODate("2019-04-08T21:00:00.000Z") } })
Of course, ISODate("2019-04-09T00:00:00+03:00") works also

Date conversion in Mongo Db

I am having trouble converting "7/26/2020 18:34:25" into any date format from which Mongo can run aggregate operation.
The date in the Mongo is stored as string.
I have tried "$toDate", "$convert" and "$dateToString".
You need to use $dateFromString
$project: {
date: {
$dateFromString: {
dateString: '$dateFieldName',
format: '%m/%d/%Y %H:%M:%S'
}
}
}
playground
Try using Moment Library for converting you date
In your case this code can help you:
moment('7/26/2020 18:34:25').toDate();
You can test this code on browser side on this page
enter link description here

mongodb date query don't work with ISODate?

I can find an item with this search:
db.item.find({"startdate":{$gte: 1485521569000 }})
The date seems to correspond to
> new Date(1485521569000)
ISODate("2017-01-27T12:52:49Z")
But if I search
db.item.find({"startdate":{"$gte" : ISODate("2017-01-01T00:00:00Z")}})
I don't get any results. What am I doing wrong?
PS
the only way I found is
db.item.find({"startdate":{"$gte" : (new Date("2017-01-01")).getTime()}})
is that right or there is a better way?
Below one will work.
db.getCollection('test').find({
"key": {
"$gte": (ISODate("2017-01-01")).getTime()
}
})
Reason:
You have your data is in int64 or long
In the new Date query, you are converting date to time which return int. So get performs integer comparison.
In ISODate you are passing a date, it doesn't convert date to integer i.e milliseconds. So if you convert, both will work.
new Date() returns the current date as a Date object. The mongo shell wraps the Date object with the ISODate helper
var d = ISODate("2017-01-01")
print(d); //Sun Jan 01 2017 05:30:00 GMT+0530 (IST)
Hence, the comparison fails.
If i understand, you have timestamp in startdate field,
This is the option if helps you, Can do it with aggregate() function, using $toDate,
$toDate convert timestamp to ISO date
db.collection.aggregate([
{
$match: {
$expr: {
$gte: [
{
$toDate: "$startdate"
},
ISODate("2017-01-27T12:52:49.000Z")
]
}
}
}
])
Playground: https://mongoplayground.net/p/H7SFHsgOcCu

I can not get dates after my current date

I want to obtain the records that the "FECHA_FIN" field is greater than or equal to today's date.
this is an example of my data:
but with this query:
db.getCollection('susp_programadas').find( {"FECHA_FIN":{ $gte: new Date("YYYY-mm-dd") }} )
I do not get results, what am I doing wrong? Thank you
You can convert the date to an ISO date and query that way. Since you stored the date as a string mongo has no idea how to query it against an ISO date without conversion.
If you stored your date in mongo as the default ISO date then you could have easily done this:
db.getCollection('susp_programadas').find({"FECHA_FIN":{$gte: new Date()}})
So this is how you can do it now:
db.getCollection('susp_programadas').aggregate([
{
$project: {
date: { $dateFromString: { dateString: '$FECHA_FIN' }}
}
},
{ $match: { date: { $gte: new Date() }}}
])
You can use the $dateFromString in an aggregate query with a $match to get the results you want. Note that $dateFromString is only available in MongoDB version 3.6 and up.
If there is no way to convert your data to ISODate or upgrade your DB you could also consider another solution which via $where:
db.getCollection('susp_programadas').find({
$where: function(){
return new Date(this.FECHA_FIN) > Date.now()
}
})
However that solution suffers from the fact that $where can not use indexes so have that in mind.

How to convert a date stored as string in MongoDB to ISODate?

I have a collection in which each document has a time field with value stored as similar to "21-Dec-2017".
I want to convert this to ISODate using projection.
My Query:
db.getCollection('orders').aggregate([{
$project:{time : {$add : new Date("$time")}}
}])
But this is returning me ISODate("1970-01-01T00:00:00.000Z") always.
you can try this,
db.getCollection('orders').aggregate([{
$project: {
time: {
$dateToString: {
format: "%d-%m-%G",
date: new Date("$time")
}
}
}
}
])
there is no any string function to get months name eg.Jan,Feb..Dec.
but you can refer https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/
to more information.
There is no problem in this ISODate("1970-01-01T00:00:00.000Z") format.
you should store date in ISO format but change format on client side according to you.
Basically you want to show date in dd/mm/yy format.
You can use http://momentjs.com/ to show date according to you.