Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find objects between two dates MongoDB

I've been playing around storing tweets inside mongodb, each object looks like this:

{ "_id" : ObjectId("4c02c58de500fe1be1000005"), "contributors" : null, "text" : "Hello world", "user" : {     "following" : null,     "followers_count" : 5,     "utc_offset" : null,     "location" : "",     "profile_text_color" : "000000",     "friends_count" : 11,     "profile_link_color" : "0000ff",     "verified" : false,     "protected" : false,     "url" : null,     "contributors_enabled" : false,     "created_at" : "Sun May 30 18:47:06 +0000 2010",     "geo_enabled" : false,     "profile_sidebar_border_color" : "87bc44",     "statuses_count" : 13,     "favourites_count" : 0,     "description" : "",     "notifications" : null,     "profile_background_tile" : false,     "lang" : "en",     "id" : 149978111,     "time_zone" : null,     "profile_sidebar_fill_color" : "e0ff92" }, "geo" : null, "coordinates" : null, "in_reply_to_user_id" : 149183152, "place" : null, "created_at" : "Sun May 30 20:07:35 +0000 2010", "source" : "web", "in_reply_to_status_id" : {     "floatApprox" : 15061797850 }, "truncated" : false, "favorited" : false, "id" : {     "floatApprox" : 15061838001 } 

How would I write a query which checks the created_at and finds all objects between 18:47 and 19:00? Do I need to update my documents so the dates are stored in a specific format?

like image 964
Tom Avatar asked May 31 '10 11:05

Tom


People also ask

What does find () do in MongoDB?

Find() Method. In MongoDB, find() method is used to select documents in a collection and return a cursor to the selected documents.

What is $GTE in MongoDB?

$gte selects the documents where the value of the field is greater than or equal to (i.e. >= ) a specified value (e.g. value .) For most data types, comparison operators only perform comparisons on fields where the BSON type matches the query value's type.


1 Answers

Querying for a Date Range (Specific Month or Day) in the MongoDB Cookbook has a very good explanation on the matter, but below is something I tried out myself and it seems to work.

items.save({     name: "example",     created_at: ISODate("2010-04-30T00:00:00.000Z") }) items.find({     created_at: {         $gte: ISODate("2010-04-29T00:00:00.000Z"),         $lt: ISODate("2010-05-01T00:00:00.000Z")     } }) => { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" } 

Based on my experiments you will need to serialize your dates into a format that MongoDB supports, because the following gave undesired search results.

items.save({     name: "example",     created_at: "Sun May 30 18.49:00 +0000 2010" }) items.find({     created_at: {         $gte:"Mon May 30 18:47:00 +0000 2015",         $lt: "Sun May 30 20:40:36 +0000 2010"     } }) => { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" } 

In the second example no results were expected, but there was still one gotten. This is because a basic string comparison is done.

like image 138
ponzao Avatar answered Dec 06 '22 17:12

ponzao