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 } ]
});