如何在mongoose查询中获取最大值。在SQL中很容易
SELECT MAX(LAST_MOD) FROM table1
Where field1=1
我想在mongoose(node.js)
中等同于上面的SQL代码答案 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);