Glasnhost
Glasnhost

Reputation: 1135

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?

Upvotes: 1

Views: 1703

Answers (2)

Gibbs
Gibbs

Reputation: 22974

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.

Upvotes: 3

turivishal
turivishal

Reputation: 36144

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

Upvotes: 1

Related Questions