Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort by field in nested array with Mongoose.js

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.

like image 456
imns Avatar asked Dec 12 '25 11:12

imns


1 Answers

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.

like image 170
JohnnyHK Avatar answered Dec 14 '25 00:12

JohnnyHK