Mongoose默认排序顺序

时间:2014-08-22 14:37:09

标签: node.js express mongoose

有没有办法在Mongoose中指定架构/模型级别的排序顺序?

我有模型Posts,我总是会抓取'createdAt'字段排序的帖子。因此,在每个查询中,我必须编写.sort('-createdAt')。我可以为此型号订购此订单吗?

3 个答案:

答案 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));
        }
    }
})