マングースクエリで最大値を取得する方法。SQLでは簡単です
SELECT MAX(LAST_MOD) FROM table1
Where field1=1
私は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;
// ...
}
);
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;
});
これを使用して、コレクション内の1つのレコード(商品など)を返すことができます。
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データベースから返されるレコードの数を常に最小限に抑えたいため、aを使用するとlimit(1)
これが確実に発生します。繰り返しになりますが、目的はパフォーマンスを向上させ、Nodejsサーバーに数千のレコードをぶつけないようにすることです。
したがってlimit(1)
、Mongoが膨大な数のレコードではなく、単一のレコードのみを通信するようにします。しかし、私は上で賛成した同様の答えの別のバリエーションを提供しているだけではありません。
別のステップを追加します。クエリから返されるこの商品の価格だけを気にするので、商品名などは気にしません。
私は.then()
声明を追加し、返品された商品のリストを取り、そこから最初の商品を取り出して、次のように価格を教えてくださいと言います。
const minQuery = Goods.find({}).sort({ price: 1 }).limit(1).then(goods => goods[0].price);
私が使用する用語を覚えておいてください。商品リストを取ります。私が使用limit(1)
したので、それはクエリがそれ自体で1つのモデルだけで解決されるという意味ではありません。ヘルパーを使用したのでfind({})
、商品のリストまたは商品の配列を返すことを意味します。したがって、そのリストをリストに限定したとしても、1
これを1つのモデルだけで呼び出すだけでよいという意味ではありません。
それはまだモデルの配列になるでしょうが、そこにはただ1つあるでしょう。
したがって、使用したので、これはまだ配列になることを認識しなければなりませんがfind({})
、その配列には単一の良いものがあります。
私がこれを行っている理由は、API応答をマッサージするためです。追加するということは、この最小クエリを取得して追加することにより、将来どこか他の場所で.then()
後続を追加する場合、最小価格で呼び出されることを意味します。.then()
.then()
したがって.then(minPrice => )
、クエリにaを追加すると、それは、だけでminPrice
呼び出され、気になる最低価格だけで呼び出されます。
したがって、これ.then()
は、このクエリを終了するためだけのものです。
逆に行うには、次のようにします。
const maxQuery = Goods.find({}).sort({ price: -1 }).limit(1).then(goods => goods[0].price);
それは完全にうまく機能します。
Model.findOne().sort({
"field": -1
});