Kevin Brown
Kevin Brown

Reputation: 12650

Mongoid query embedded document and return parent

I have this document, each is a tool:

{ 
    "_id" : ObjectId("54da43aea96ddcc40915a457"), 
    "checked_in" : false, 
    "barcode" : "PXJ-234234", 
    "calibrations" : [
        {
            "_id" : ObjectId("54da46ec546173129d810100"), 
            "cal_date" : null, 
            "cal_date_due" : ISODate("2014-08-06T00:00:00.000+0000"), 
            "time_in" : ISODate("2015-02-10T17:46:20.250+0000"), 
            "time_out" : ISODate("2015-02-10T17:46:20.250+0000"), 
            "updated_at" : ISODate("2015-02-10T17:59:08.796+0000"), 
            "created_at" : ISODate("2015-02-10T17:59:08.796+0000")
        }, 
        {
            "_id" : ObjectId("5509e815686d610b70010000"), 
            "cal_date_due" : ISODate("2015-03-18T21:03:17.959+0000"), 
            "time_in" : ISODate("2015-03-18T21:03:17.959+0000"), 
            "time_out" : ISODate("2015-03-18T21:03:17.959+0000"), 
            "cal_date" : ISODate("2015-03-18T21:03:17.959+0000"), 
            "updated_at" : ISODate("2015-03-18T21:03:17.961+0000"), 
            "created_at" : ISODate("2015-03-18T21:03:17.961+0000")
        }, 
        {
            "_id" : ObjectId("5509e837686d610b70020000"), 
            "cal_date_due" : ISODate("2015-03-18T21:03:51.189+0000"), 
            "time_in" : ISODate("2015-03-18T21:03:51.189+0000"), 
            "time_out" : ISODate("2015-03-18T21:03:51.189+0000"), 
            "cal_date" : ISODate("2015-03-18T21:03:51.189+0000"), 
            "updated_at" : ISODate("2015-03-18T21:03:51.191+0000"), 
            "created_at" : ISODate("2015-03-18T21:03:51.191+0000")
        }
    ], 
    "group" : "Engine", 
    "location" : "Here or there", 
    "model" : "ZX101C", 
    "serial" : NumberInt(15449), 
    "tool" : "octane analyzer", 
    "updated_at" : ISODate("2015-09-30T20:43:55.652+0000"), 
    "description" : "Description...", 
}

Tools are calibrated periodically. What I want to do is grab tools that are due this month.

Currently, my query is this:

scope :upcoming, -> { where(:at_ats => false).where('calibrations.0.cal_date_due' => {'$gte' => Time.now-1.day, '$lte' => Time.now+30.days}).order_by(:'calibrations.cal_date_due'.asc) }

However, this query gets the tool by the first calibration object and it needs to be the last. I've tried a myriad of things, but I'm stuck here.

How can I make sure I'm querying the most recent calibration document, not the first (which would be the oldest and therefore not relevant)?

Upvotes: 0

Views: 506

Answers (1)

hecnabae
hecnabae

Reputation: 407

You should look into aggregation framework and $unwind operator.

This link may be of help. This link may be helpful. It contains an example of use of 'aggregation framework' for get the last element of the array, that is, the most recent in your case.

Upvotes: 1

Related Questions