3

Given the data structure (based on my model) below how would I go about sorting the collection by cars.year in desc order with mongoose? So that first I find the max year in the cars array and then sort the collection by that.

{ "_id" : 1234,
  "dealershipName": "Eric’s Mongo Cars",
  "cars": [
           {"year": 2013,
            "make": "10gen",
            "model": "MongoCar",},
           {"year": 1985,
            "make": "DeLorean",
            "model": "DMC-12",}
  ]
},
{ "_id" : 1235,
  "dealershipName": "Eric’s Mongo Cars",
  "cars": [
           {"year": 2015,
            "make": "10gen",
            "model": "MongoCar",},
           {"year": 12001,
            "make": "DeLorean",
            "model": "DMC-12",}
  ]
}

I tried something like this with the aggregation function, but $unwind duplicates my results for each element in the cars array.

MyModel
    .aggregate([{
        $unwind: "$cars"
    }, {
        $project: {
            ...
            year: '$cars.year',
        }
    }, {
        $sort: {
            year: -1
        }
    }])
    .exec(function ...)

Is there a better or more efficient way to go about doing this?

Thanks in advance for your help.

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
imns
  • 4,996
  • 11
  • 57
  • 80

1 Answers1

2

What you're looking for is the standard behavior when sorting by a field in an array.

MyModel.find().sort('-cars.year').exec(function(err, docs) {...});

This will sort the docs descending using the maximum value of year in the elements of cars from each doc.

When sorting ascending, the minimum value is used.

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
  • @AryehArmon What doesn't work about it for you? Keep in mind that it sorts the documents, not the `cars` arrays within each document. – JohnnyHK Jun 29 '16 at 13:37