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代码
我无法得到其他工作的答案.也许我正在使用更新版本的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)
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)
小智 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)
在提供以下答案之前,我对俄罗斯同事进行了投票,我将解释原因作为我的答案。
我的理解是,目标是从集合中取出任何模型的列表,按特定顺序对它们进行排序,然后只取出第一个条目。
所以首先我们从一个最小的查询开始,如下所示:
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)
| 归档时间: |
|
| 查看次数: |
15895 次 |
| 最近记录: |