user555
user555

Reputation: 1529

Date range queries mongodb

I've two collections one is random and other one is 'msg'

In message I've a document like

{ "message": "sssss", postedAt: Fri Jul 17 2015 09:03:43 GMT+0530 (IST) }

For random collection, there is a script which generates random number every minute

like

 { "randomStr": "sss", postedAt: Fri Jul 17 2015 09:03:43 GMT+0530 (IST) }
 { "randomStr": "xxx", postedAt: Fri Jul 17 2015 09:04:43 GMT+0530 (IST) }
 { "randomStr": "yyy", postedAt: Fri Jul 17 2015 09:05:43 GMT+0530 (IST) }

Notice the change in timings, for every mintute there is a new record.

Now, my issue is

when I query for message collection, I'll get one record.

Lets's say this

{ "message": "sssss", postedAt: Fri Jul 17 2015 09:03:13 GMT+0530 (IST) }

now I want to get the record from random collection which posts at exact minute

this message is posted at 09:03, I want to get the record from random collection which postedat exactly same time 09:03.

How to do that? Any help appreciated. Thx.

Note: I'm doing this in meteor

Edit

Added image for first comment enter image description here

Upvotes: 0

Views: 63

Answers (1)

Blakes Seven
Blakes Seven

Reputation: 50406

So the point here is 'actually use a range' and also be aware of the Date value you get in return. So as a basic example in principle.

The time right now as I execute this is:

var date = new Date()
ISODate("2015-07-17T04:02:04.471Z")

So if you presume then that your actual timestamp in the document is "not exactly to the minute" (like above) nor is it likely the "random record" is so then the first thing to do is "round" it to the minute:

date = new Date(date.valueOf() - date.valueOf() % ( 1000 * 60 ))
ISODate("2015-07-17T04:02:00Z")

And of course the "end date" is just one minute after that:

var endDate = new Date(date.valueOf() + ( 1000 * 60 ))
ISODate("2015-07-17T04:03:00Z")

Then when you query "rqndom" you just get the "range", with $gte and $lt operators:

db.random.find({ "postedAt": { "$gte": date, "$lt": endDate } })

Which just retrieves your single "write once a minute" item from "random" at any possible value within that minute.

So basically:

  • Round your input retrieved date to the minute
  • Search on the "range" betweeen that value and the next minute

Upvotes: 1

Related Questions