获取mongoose的最大值

时间:2012-05-13 14:40:16

标签: node.js mongodb mongoose

如何在mongoose查询中获取最大值。在SQL中很容易

SELECT MAX(LAST_MOD) FROM table1
Where field1=1

我想在mongoose(node.js)

中等同于上面的SQL代码

5 个答案:

答案 0 :(得分:9)

我无法得到其他工作的答案。也许我正在使用更新版本的Mongoose(mongoose@3.0.1)。

这对我有用:

Table1.findOne()
    .where({field1: 1})
    .sort('-LAST_MOD')
    .exec(function(err, doc)
    {
        var max = doc.LAST_MOD;
        // ...
    }
);

答案 1 :(得分:7)

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

答案 2 :(得分:2)

您可以使用它来返回收藏集中的一条记录(例如商品):

Goods
   .find({})
   .select({"price"})
   .sort({"price" : -1})
   .limit(1)
   .exec(function(err, doc){
      let max_price = doc[0].price;
});

答案 3 :(得分:0)

它工作得很好。

Model.findOne().sort({
        "field": -1
    });

答案 4 :(得分:0)

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

我的理解是,目标是从集合中取出所有Model的列表,按特定顺序对其进行排序,然后从其中取出第一个条目。

所以首先我们从一个最小查询开始,像这样:

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数据库返回的记录的数量,因此使用limit(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()来添加任何后续的.then(),它将以最低价格被调用。< / p>

因此,如果我们在查询中添加.then(minPrice => ),则仅使用minPrice进行调用,而仅使用我们关心的最低价格进行调用。

因此.then()只是为了终止此查询。

现在,反过来,我们要做:

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