10

如何在猫鼬查询中获得最大值。在 SQL 中很容易

SELECT MAX(LAST_MOD) FROM table1
Where field1=1

我想在猫鼬(node.js)中等效于上述SQL代码

4

5 回答 5

11

I couldn't get the other answers to work. Perhaps I'm using a newer version of Mongoose (mongoose@3.0.1).

This worked for me:

Table1.findOne()
    .where({field1: 1})
    .sort('-LAST_MOD')
    .exec(function(err, doc)
    {
        var max = doc.LAST_MOD;
        // ...
    }
);
于 2012-09-15T21:30:10.083 回答
10

MongoDB 支持 max/min,但他们不建议在实际应用程序中使用它:

min 和 max 主要用于支持 mongos(分片)进程。

http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

你几乎可以得到相同的结果:

Model.findOne({ field1 : 1 }).sort(last_mod, 1).run( function(err, doc) {
     var max = doc.last_mod;
});
于 2012-05-13T16:28:30.307 回答
6

您可以使用它来返回集合中的一条记录(例如货物):

Goods
   .find({})
   .select({"price"})
   .sort({"price" : -1})
   .limit(1)
   .exec(function(err, doc){
      let max_price = doc[0].price;
});
于 2018-10-09T20:49:29.380 回答
5

在提供以下答案之前,我对俄罗斯同事进行了投票,我将解释原因作为我的答案。

我的理解是,目标是从集合中取出任何模型的列表,按特定顺序对它们进行排序,然后只取出第一个条目。

所以首先我们从一个最小查询开始,如下所示:

const minQuery = Model.find({}).sort().limit(1);

请注意,我正在使用find()而不是findOne(),我相信它的性能更高。

然后我们进行排序,在这种情况下,我将以同事的示例Goods作为模型,让我了解我们正在排序的内容:

const minQuery = Goods.find({}).sort({ price: 1 }).limit(1);

这是关键部分,我只想取回第一个商品,因为第一个商品将是价格最低的商品,这就是您所看到的限制方法的来源:

const minQuery = Goods.find({}).sort({ price: 1 }).limit(1);

为什么我.limit(1);像上面的同事一样添加这个?

因为我们总是希望最小化从 MongoDB 数据库返回的记录数量,所以使用 alimit(1)可以确保这种情况发生。同样,目标是提高性能,而不是用数千条记录轰炸我们的 Nodejs 服务器。

因此limit(1)确保 Mongo 只回传一条记录,而不是大量记录。但我不只是提供我在上面赞成的类似答案的另一种变体。

我将添加另一个步骤。因为我只关心这个商品的价格,因为它是从查询中返回的,我不关心商品名称或其他什么。

我要添加一份.then()声明,列出退回的商品清单,然后说把第一件商品从那里拿出来,然后给我它的价格,如下所示:

const minQuery = Goods.find({}).sort({ price: 1 }).limit(1).then(goods => goods[0].price);

请记住我使用的术语。我会拿货物清单。因为我使用limit(1)了这并不意味着查询将仅使用一个模型自行解析。因为我使用了find({})助手,这意味着给我一个商品列表或商品数组。因此,即使我将该列表限制为1它并不意味着我们只会用一个模型本身来调用它。

它仍将是一系列模型,但其中只会有一个模型。

所以我们必须认识到这仍然是一个数组,因为我们使用了find({})但该数组中将有一个单一的商品。

我这样做的原因是为了按摩 API 响应。通过添加.then()意味着,如果我.then()在未来在其他任何地方添加任何后续内容,则通过获取此最小查询并添加 a .then(),它将以最低价格调用。

因此,如果我们将 a 添加.then(minPrice => )到查询中,它将仅使用 调用minPrice,它将仅使用我们关心的最低价格调用。

所以这.then()只是为了让我们自己终止这个查询。

所以现在反过来做,我们这样做:

const maxQuery = Goods.find({}).sort({ price: -1 }).limit(1).then(goods => goods[0].price);
于 2019-02-24T17:09:31.520 回答
2

它工作得很好。

Model.findOne().sort({
        "field": -1
    });
于 2018-12-22T00:24:16.293 回答