如何在猫鼬查询中获得最大值。在 SQL 中很容易
SELECT MAX(LAST_MOD) FROM table1
Where field1=1
我想在猫鼬(node.js)中等效于上述SQL代码
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;
// ...
}
);
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;
});
您可以使用它来返回集合中的一条记录(例如货物):
Goods
.find({})
.select({"price"})
.sort({"price" : -1})
.limit(1)
.exec(function(err, doc){
let max_price = doc[0].price;
});
在提供以下答案之前,我对俄罗斯同事进行了投票,我将解释原因作为我的答案。
我的理解是,目标是从集合中取出任何模型的列表,按特定顺序对它们进行排序,然后只取出第一个条目。
所以首先我们从一个最小查询开始,如下所示:
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);
它工作得很好。
Model.findOne().sort({
"field": -1
});