Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongoose/mongodb query multiple sort

i'm quite new to mongodb. i manage to get a basic idea of a simple sort based only 1 parameter. what if there are more than 2 sort parameters. for instance, in a database made up of woodworking projects that have attributes totalCuttingTime and favorited.

Is the following a correct mongoose/mongodb function to find a list of projects that have the least totalCuttingTime and order in according to highest favoriteCounts to lowest.

var ProjectModel= mongoose.model('Project', schema);

exports.getMinCuttingTime = function(number, callback){      var leastCutTimeResult = ProjectModel.find().sort({totalCuttingTime: 1}).select({_id: 1}).limit(number).exec(             function(err, projects) {                 callback(null, projects)             }         );      var result = leastCutTimeResult.find().sort({favoriteCount: -1}).select({_id: 1}).limit(number).exec(             function(err, projects) {                 callback(null, projects)             }         );       return result; } 
like image 592
bouncingHippo Avatar asked Nov 26 '12 15:11

bouncingHippo


People also ask

Does MongoDB support sorting?

MongoDB may use multiple indexes to support a sort operation if the sort uses the same indexes as the query predicate. If MongoDB cannot use an index or indexes to obtain the sort order, MongoDB must perform a blocking sort operation on the data.

What does .exec do in mongoose?

In mongoose, exec method will execute the query and return a Promise.

What is the use of sort () in MongoDB?

This operation sorts the documents in the users collection, in descending order according by the age field and then in ascending order according to the value in the posts field.


1 Answers

You need to put both sort terms into one object:

exports.getMinCuttingTime = function(number, callback){      ProjectModel.find()         .sort({totalCuttingTime: 1, favoriteCount: -1})         .select({_id: 1})         .limit(number)         .exec(             function(err, projects) {                 callback(null, projects)             }         ); }; 

It's worth noting that the ECMA-262 standard on which Node.js is based doesn't specify that an object's property order is maintained, and it's only a de facto standard to match insertion order. To eliminate any doubt, you can use an array instead:

.sort([['totalCuttingTime', 1], ['favoriteCount', -1]]) 
like image 106
JohnnyHK Avatar answered Oct 13 '22 19:10

JohnnyHK