有没有办法在Mongoose中指定架构/模型级别的排序顺序?
我有模型Posts
,我总是会抓取'createdAt'
字段排序的帖子。因此,在每个查询中,我必须编写.sort('-createdAt')
。我可以为此型号订购此订单吗?
答案 0 :(得分:2)
在Mongoose中,没有办法直接在查询中定义默认排序顺序。
如果你一遍又一遍地做某事,你可能想把它抽象成一个为你做的事情:
function findPostsByDate(cb){
Posts.find({}).sort('-createdAt').exec(cb);
}
甚至比这更通用的东西:
function findXByDate(model, findCriteria, cb){
model.find(findCriteria).sort('-createdAt').exec(cb);
}
答案 1 :(得分:0)
您可以通过在架构定义中创建静态方法来实现此目的。
此处的方法和静态的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 */ });
答案 2 :(得分:0)
这是我强制执行可排序列并提供默认排序的方法。我将此代码复制到每个模型中,并提供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));
}
}
})