【问题标题】:How do I sort 'auto-magically' using Mongoose?如何使用猫鼬“自动”排序?
【发布时间】:2014-01-04 03:19:25
【问题描述】:

假设我有一个这样的网址:

http://dev.myserver.com/systems?system_type.category=Penetration

命中以下控制器:

exports.findAll = function(req, res) { 
    System.find(req.query, function(err, systems) {
        res.send(systems);
    });
};

然后使用 Node、Express、MongoDB 和 Mongoose 自动返回下面的集合:

[{
    "_id":            "529e5f29c128685d860b3bad",
    "system_number":  "123",
    "target_country": "USA",
    "system_type":     {
        "category":   "Penetration",
        "subcategory": ["Floor", "Wall"]
    }
},{
    "_id":            "999e5f29c128685d860b3bad",
    "system_number":  "456",
    "target_country": "Canada",
    "system_type":     {
        "category":   "Penetration",
        "subcategory": ["Floor", "Wall"]
    }
}]

现在,如果我想要按“target_country”排序的结果,那么“自动魔术”这样做的“最佳实践”是什么?

Mongoose/Express 是否希望为我执行某些参数/语法?或者,这是我必须专门为它编码的情况吗? (那会杀死已经存在的“自动魔法”功能。)

谢谢!

更新:这对我有用。

exports.findAll = function(req, res) {

    // Sort Ascending: 
    http://dev.dom.com/systems?system_type.category=Penetration&sort=system_number

    // Sort Descending:
    http://dev.dom.com/systems?system_type.category=Penetration&sort=-system_number

    // Default sort ascending on system_number:
    http://dev.dom.com/systems?system_type.category=Penetration

    var sort_param = req.query.sort ? req.query.sort : 'system_number';

    System.find().sort(sort_param).find(function(err, menus) {        
        res.send(menus);
    });

};

我猜我哪里出错了,我认为我应该使用过滤器查找然后排序,而不是查找全部,排序然后使用过滤器再次查找。我猜我的头脑仍然围绕着整个“回调哲学”。

【问题讨论】:

  • 不是重复的。在另一个线程中,排序参数已知为“日期”。这里,不知道GET请求查询参数中提供的排序参数会是什么。我建议它是“target_country”,但它可以是任何有效字段。 (为了清楚起见,我只在示例中展示了一些 - 还有更多。)

标签: node.js mongodb sorting mongoose


【解决方案1】:

您需要为 System 查询的查询和排序组件定义单独的 URL 参数。如:

System.find(req.query.query).sort(req.query.sort).exec(function(err, systems) {
    res.send(systems);
});

然后您将使用如下所示的请求 URL 参数:

?sort=target_country
    &query[system_type.category]=Penetration
    &query[system_type.subcategory]=Floor

sorthere 上的文档。

【讨论】:

  • 好吧,如果我将 http 请求编辑为:dev.myserver.com/…,那么我将需要使用 .sort(req.query.sort) 但失败,可能是由于“更大”的问题。当排序参数在查询中时,即使使用我定义的控制器方法(没有排序)似乎也会失败。我得到一个空集。显然我还不了解 System.find(re.query) 。想法?
  • @Eric 好的,我明白你现在要做什么了。如果您使用整个 req.query 作为您的 Mongoose 查询对象,那么您将无法单独指定排序参数。您需要为查询和排序定义单独的 URL 参数。查看更新的答案。
  • 我已经更新了我的问题以包含答案。我现在意识到我没有正确地形成原始问题。如果我让您感到困惑,请向 JohnnyHK 道歉。感谢您帮助我找到正确答案。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 2011-05-17
  • 1970-01-01
  • 2014-07-29
  • 2020-05-30
  • 2016-10-16
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多