Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongooseJS-如何找到具有最大值的元素?_Node.js_Mongodb_Mongoose_Max_Database - Fatal编程技术网

Node.js MongooseJS-如何找到具有最大值的元素?

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

我正在使用MongoDB、MongooseJS和Nodejs

我有一个集合(称为成员),包含以下字段-

国家id、会员id、姓名、分数

我想写一个查询,返回最大分数的成员,其中Country id=10

我在MongooseJS中找不到适合的文档

我在StackOVerflow找到了这个(这是MongoDB代码)


但是如何将其翻译成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 } ]
});