获取mongoose的最大值

Maj*_*eri 9 mongoose mongodb node.js

如何在mongoose查询中获得最大值.在SQL中很容易

SELECT MAX(LAST_MOD) FROM table1
Where field1=1
Run Code Online (Sandbox Code Playgroud)

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

Dre*_*kes 9

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

这对我有用:

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


dri*_*hev 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;
});
Run Code Online (Sandbox Code Playgroud)

  • 我想你想要`sort(last_mod,-1)`来取得最大值; 上面的升序将给出最小值. (5认同)

小智 6

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

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


Dan*_*iel 5

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

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

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

const minQuery = Model.find({}).sort().limit(1);
Run Code Online (Sandbox Code Playgroud)

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

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

const minQuery = Goods.find({}).sort({ price: 1 }).limit(1);
Run Code Online (Sandbox Code Playgroud)

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

const minQuery = Goods.find({}).sort({ price: 1 }).limit(1);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我将添加一个.then()声明,并列出退回的商品清单,然后说从那里取出第一件商品并给我价格,如下所示:

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

请记住我使用的术语。我来拿货单。因为我使用了limit(1)这并不意味着查询将仅使用一个模型来解决。因为我用了find({})helper,那就是给我回一个商品清单或一系列商品。因此,即使我将该列表限制为1它,也不意味着我们只能使用单个模型来调用它。

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

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

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

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

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

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

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