10

マングースクエリで最大値を取得する方法。SQLでは簡単です

SELECT MAX(LAST_MOD) FROM table1
Where field1=1

私はmongoose(node.js)の上記のSQLコードと同等のものが欲しい

4

5 に答える 5

11

私は他の答えを得ることができませんでした。おそらく、私は新しいバージョンのMongoose(mongoose@3.0.1)を使用しています。

これは私のために働いた:

Table1.findOne()
    .where({field1: 1})
    .sort('-LAST_MOD')
    .exec(function(err, doc)
    {
        var max = doc.LAST_MOD;
        // ...
    }
);
于 2012-09-15T21:30:10.083 に答える
10

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;
});
于 2012-05-13T16:28:30.307 に答える
6

これを使用して、コレクション内の1つのレコード(商品など)を返すことができます。

Goods
   .find({})
   .select({"price"})
   .sort({"price" : -1})
   .limit(1)
   .exec(function(err, doc){
      let max_price = doc[0].price;
});
于 2018-10-09T20:49:29.380 に答える
5

私は次の答えを出す前にロシア人の同僚に賛成しました、そして私は私の答えとしてその理由を説明します。

私の理解では、目標はコレクションからモデルのリストを取り出し、それらを特定の順序で並べ替えて、そこから最初のエントリだけを取り出すことです。

したがって、最初に次のような最小限のクエリから始めます。

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);
于 2019-02-24T17:09:31.520 に答える
2

それは完全にうまく機能します。

Model.findOne().sort({
        "field": -1
    });
于 2018-12-22T00:24:16.293 に答える