mongoosejs如何对不同的查询进行排序?

时间:2014-06-10 08:26:14

标签: javascript node.js mongodb mongoose aggregation-framework

如何对不同的查询进行排序 我试过这个

exports.categories = function(req, res) {
    Article.distinct({'categories' : true}).sort({'categories': 1}).exec(function(err, categories) {
        if (err) {
           return res.json(500,{ error: 'Cannot get the categories' });
        }
        res.json(categories); 
    });
};

但它没有用。

更新

@Neil Lunn的回复

exports.categories = function(req, res) {
    Article.aggregate(
    [
        { '$group': { '_id': '$categories' }},
        { '$sort': { 'categories': 1 }}
    ])
    .exec(function(err,categories) {
        if (err) {
            return res.json(500, err);
        } 
        res.json(categories);
    });
};

但我已经

  

[{" _id":["普米族"]},{" _id":["普米族"" Secondi"]},{" _id":[" Dolci的"]},{" _id":[" Secondi"]} ]

1 个答案:

答案 0 :(得分:3)

它不会.sort(),因为它不会返回光标。 .distinct()方法是mapReduce的一个包装,与返回游标的.find()命令的结果不同。

所以甚至比使用聚合框架更好:

Article.aggregate(
    [
        { "$unwind": "$categories" },
        { "$group": { "_id": "$categories" },
        { "$sort": { "categories": 1 }
    ],
    function(err,result) {

       // work here
    }
);

输出略有不同,但整体结果应该更快一些并且排序。

您也可以在作为来自distinct方法的响应返回的数组上使用JavaScript .sort()方法,就像您可以使用JavaScript .map()方法去除&#一样34;值"来自聚合结果对象中的_id个键。

仍然说.aggregate()方法应该比.distinct()更好,因为服务器上的实现是本机代码而不是JavaScript并且已解释。