Node.js MongooseJS-如何找到具有最大值的元素?
我正在使用MongoDB、MongooseJS和Nodejs 我有一个集合(称为成员),包含以下字段- 国家id、会员id、姓名、分数 我想写一个查询,返回最大分数的成员,其中Country id=10 我在MongooseJS中找不到适合的文档 我在StackOVerflow找到了这个(这是MongoDB代码)Node.js MongooseJS-如何找到具有最大值的元素?,node.js,mongodb,mongoose,max,database,Node.js,Mongodb,Mongoose,Max,Database,我正在使用MongoDB、MongooseJS和Nodejs 我有一个集合(称为成员),包含以下字段- 国家id、会员id、姓名、分数 我想写一个查询,返回最大分数的成员,其中Country id=10 我在MongooseJS中找不到适合的文档 我在StackOVerflow找到了这个(这是MongoDB代码) 但是如何将其翻译成MongooseJS呢?您不需要Mongoose文档就可以做到这一点。 普通MongoDb将完成这项工作 假设您拥有您的会员收藏: { "_id" : ObjectI
但是如何将其翻译成MongooseJS呢?您不需要Mongoose文档就可以做到这一点。 普通MongoDb将完成这项工作 假设您拥有您的
会员
收藏:
{ "_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)
检查,它们很好
如果不想再次编写相同的代码,还可以向成员模型添加一个静态方法,如下所示:
memberSchema.statics.findMax = function (callback) {
this.findOne({ country_id: 10 }) // 'this' now refers to the Member class
.sort('-score')
.exec(callback);
}
稍后通过Member.findMax(回调)
调用它可能是使用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]
});
使用Mongoose查询帮助程序可以快速轻松地完成此操作 这方面的一般形式可以是:
<Your_Model>.find()
.sort("-field_to_sort_by")
.limit(1)
.exec( (error,data) => someFunc(error,data) {...} );
.find()
.sort(“-field\u to\u sort\u by”)
.限额(1)
.exec((错误,数据)=>someFunc(错误,数据){…});
tldr:
这将为您提供一个单个项的数组,其值在“field_to_sort_by”中最高。别忘了以数据[0]的形式访问它,就像我花了一个小时访问它一样
长篇大论:一步一步地讲那一串函数在做什么
Your_Model.find()
启动查询,不需要参数
.sort(“-field\u to\u sort\u by”)
按降序对所有内容进行排序。字段名前面的减号指定按降序排序,您可以放弃它按升序排序,从而获得最小值的文档
.limit(1)
告诉数据库只返回第一个文档,因为我们只需要排名靠前的文档
.exec((error,data)=>someFunc(error,data){…})
最后将所有错误和包含文档的数组传递到函数中。您可以在数据[0]
中找到您的文档。您还可以使用$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 } ]
});
谢谢我一直在我的代码中使用Mongoose,如果我继续这样做会很好。Salvador Dali-当然,我可以在Mongoose代码之间插入此代码并使其工作。但我想知道猫鼬做这件事的方式。谢谢
<Your_Model>.find()
.sort("-field_to_sort_by")
.limit(1)
.exec( (error,data) => someFunc(error,data) {...} );
// 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 } ]
});