mongoose默认的sorting顺序

有没有一种方法来指定在Mongoose模式/模型级别的sorting顺序?

我有模型的Posts ,我总是抓取'createdAt'字段sorting的post。 因此,在每个查询我必须写.sort('-createdAt') 。 我可以为这个模型默认这个订单吗?

在Mongoose中,没有办法直接在查询中定义默认的sorting顺序。

如果你一遍又一遍地做某些事情,你可能想把它抽象成一个为你做的事情:

 function findPostsByDate(cb){ Posts.find({}).sort('-createdAt').exec(cb); } 

甚至比这更通用:

 function findXByDate(model, findCriteria, cb){ model.find(findCriteria).sort('-createdAt').exec(cb); } 

您可以通过在模式定义中创build静态方法来实现此目的。

方法和静态的Mongoose文档在这里: http : //mongoosejs.com/docs/2.7.x/docs/methods-statics.html

在您的模式文件中:

 PostSchema.statics.sortedFind = function sortedFind(query, fields, options cb){ //First 3 parameters are optional if( arguments.length === 1){ cb = query; } else if (arguments.length === 2) { cb = fields; } else if(arguments.length === 3){ cb = options; } this.find(query, fields, options).sort('-createdAt').exec(cb); } 

那么你可以使用:

 var query = {user_id: currentUser.id}; // query example, modify according to your needs Post.sortedFind(query, function(err, response){ /* Your code goes here */ }); 

这是我强制sorting列和提供默认sorting。 我将这段代码复制到每个模型中,只提供allowSortOn数组。

 postSchema.pre('find', function (){ if (typeof this.options.sort !== 'undefined') { var allowSortOn = ["_id","createdAt"] // add other allowable sort columns here , propCount = 0; for (var prop in this.options.sort) if (this.options.sort.hasOwnProperty(prop)) { if (allowSortOn.indexOf(prop) === -1) { console.log('Invalid sort column ' + prop); delete this.options.sort[prop]; } else { propCount++; } } if (propCount === 0) { this.options.sort[allowSortOn[1]] = 1; console.log('Setting sort column to ' + JSON.stringify(this.options.sort)); } } })