MongooseJS - Как найти элемент с максимальным значением?

Я использую MongoDB, MongooseJS и Nodejs.

У меня есть коллекция (называемая членом) со следующими полями -

Country_id, Member_id, Name, Score

Я хочу написать запрос, который возвращает член с максимальным счетом, где Country id = 10

Я не смог найти подходящую документацию для этого в MongooseJS.

Я нашел это в StackOVerflow (это код MongoDB)

Model.findOne({ field1 : 1 }).sort(last_mod, 1).run( function(err, doc) {
     var max = doc.last_mod;
});

Но как перевести то же самое на MongooseJS?

Ответ 1

Member
  .findOne({ country_id: 10 })
  .sort('-score')  // give me the max
  .exec(function (err, member) {

    // your callback code

  });

Отметьте документы mongoose для запросов, они довольно хороши.

Если вы не хотите снова писать тот же код, вы также можете добавить статический метод к вашей модели-члену следующим образом:

memberSchema.statics.findMax = function (callback) {

  this.findOne({ country_id: 10 }) // 'this' now refers to the Member class
    .sort('-score')
    .exec(callback);
}

И позвоните позже через Member.findMax(callback)

Ответ 2

Для этого вам не нужна документация Mongoose. Обычный MongoDb выполнит эту работу.

Предположим, что у вас есть коллекция Member:

{ "_id" : ObjectId("527619d6e964aa5d2bdca6e2"), "country_id" : 10, "name" : "tes2t", "score" : 15 }
{ "_id" : ObjectId("527619cfe964aa5d2bdca6e1"), "country_id" : 10, "name" : "test", "score" : 5 }
{ "_id" : ObjectId("527619e1e964aa5d2bdca6e3"), "country_id" : 10, "name" : "tes5t", "score" : -6 }
{ "_id" : ObjectId("527619e1e964aa5d2bdcd6f3"), "country_id" : 8, "name" : "tes5t", "score" : 24 }

Следующий запрос вернет вам курсор в документ, который вы ищете:

 db.Member.find({country_id : 10}).sort({score : -1}).limit(1)

Ответ 3

Может быть быстрее использовать find() чем findOne().

С find().limit(1) возвращается массив одного документа. Чтобы получить объект документа, вам нужно получить первый элемент массива, maxResult[0].

Сальвадор ответит более полным...

var findQuery = db.Member.find({country_id : 10}).sort({score : -1}).limit(1);

findQuery.exec(function(err, maxResult){
    if (err) {return err;}

    // do stuff with maxResult[0]

});

Ответ 4

Это быстро и легко с помощью помощников запросов Mongoose.

Общая форма для этого может быть:

<Your_Model>.find()
   .sort("-field_to_sort_by")
   .limit(1)
   .exec( (error,data) => someFunc(error,data) {...} );

TL;DR: Это даст вам массив из одного элемента с самым высоким значением в поле field_to_sort_by. Не забудьте получить к нему доступ как данные [0], как я сделал в течение часа.

Long-winded: шаг за шагом на том, что делает эта строка функций...

Your_Model.find() запускает запрос, никаких аргументов не требуется.

.sort("-field_to_sort_by") сортирует все в порядке убывания. Этот знак минус перед именем поля указывает сортировку в порядке убывания, вы можете отбросить его для сортировки в порядке возрастания и, таким образом, получить документ с минимальным значением.

.limit(1) сообщает базе данных только о возврате первого документа, потому что нам нужен только документ с наивысшим рангом.

.exec( (error,data) => someFunc(error,data) {...} ) наконец, передает в вашу функцию любые ошибки и массив, содержащий ваш документ. Вы найдете свой документ в data[0]

Ответ 5

Вы также можете использовать оператор $max:

// find the max age of all users
Users.aggregate(
    { $group: { _id: null, maxAge: { $max: '$age' }}}
  , { $project: { _id: 0, maxAge: 1 }}
  , function (err, res) {
  if (err) return handleError(err);
  console.log(res); // [ { maxAge: 98 } ]
});