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; }
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.
In mongoose, exec method will execute the query and return a Promise.
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.
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]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With