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

标签 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":["Primi"]},{"_id":["Primi","Secondi"]},{"_id":["Dolci"]},{"_id":["Secondi"]}]

最佳答案

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

因此,使用聚合框架比这更好:

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

       // work here
    }
);

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

您还可以在作为不同方法的响应返回的数组上使用 JavaScript .sort() 方法,就像您可以使用 JavaScript .map 一样() 方法从聚合结果对象的 _id 键中去除“值”。

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

关于javascript - mongoosejs 如何对不同的查询进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24136224/

相关文章:

javascript - 使用 JavaScript/Knockout 下拉列表中选定的值填充 MVC3 View 模型?

javascript - IE jQuery 对象错误 SCRIPT5007

javascript - 在 Sockets.IO Node.JS 中存储和访问客户端列表的最有效方法

node.js - 为 Bamboo build设置环境变量

mongodb - 为什么 serverstatus 对 mongod 写操作有不好的影响?

node.js - Mongodb:仅当该对象的元素唯一时才将对象插入到数组中

javascript - 将英语数字转换为波斯语

javascript - 使用 jQuery 将元素与鼠标位置对齐有一个偏移量

javascript - Nodejs 和 mqtt 发送消息一次或不断

mongodb - Node mongoose 嵌入文档数组