Вопрос по mongodb, node.js, mongoose – получить максимальное значение в мангусте

9

Как получить максимальное значение в запросе мангуста. в SQL это легко

<code>SELECT MAX(LAST_MOD) FROM table1
Where field1=1
</code>

я хочу эквивалент вышеуказанного кода SQL в мангусте (node.js)

Ваш Ответ

5   ответов
6

но они не рекомендуют использовать его в реальных приложениях:

min и max существуют главным образом для поддержки процесса монго (шардинга).

http: //www.mongodb.org/display/DOCS/min+and+max+Query+Specifier

Вы можете получить тот же результат:

Model.findOne({ field1 : 1 }).sort(last_mod, 1).run( function(err, doc) {
     var max = doc.last_mod;
});
Думаю, ты захочешьsort(last_mod, -1) вместо этого получить максимум; восходящая сортировка выше даст ми JohnnyHK
run() метод устарел в mongoose 4.0.2 и этоsort() слишком. Я отправил модификацию о. Zachary Dahan
9

я использую более новую версию Mongoose ([email protected]).

Это сработало для меня:

Table1.findOne()
    .where({field1: 1})
    .sort('-LAST_MOD')
    .exec(function(err, doc)
    {
        var max = doc.LAST_MOD;
        // ...
    }
);
2

имер, Товары):

Goods
   .find({})
   .select({"price"})
   .sort({"price" : -1})
   .limit(1)
   .exec(function(err, doc){
      let max_price = doc[0].price;
});
0

Он отлично работает.

Model.findOne().sort({
        "field": -1
    });
0

прежде чем дать следующий ответ, и я объясню почему в качестве ответа.

Я понимаю, что цель состоит в том, чтобы взять список всех моделей из коллекции, отсортировать их в определенном порядке и извлечь только первую запись.

Итак, сначала мы начнем с минимального запроса, например:

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() он будет вызываться по минимальной цене.

Так что, если мы добавим на.then(minPrice => ) к запросу, он будет вызываться только сminPrice, он будет вызван только с минимальной ценой, которая нам небезразлична.

Так что.then() - это просто прекращение этого запроса.

Так что теперь, чтобы сделать это наоборот, мы делаем:

const maxQuery = Goods.find({}).sort({ price: -1 }).limit(1).then(goods => goods[0].price);

Похожие вопросы