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

时间:2013-11-03 09:16:56

标签: node.js mongodb mongoose max database

我正在使用MongoDB,MongooseJS和Nodejs。

我有一个Collection(名为Member),其中包含以下字段 -

Country_id,Member_id,姓名,分数

我想写一个查询,该查询返回具有最大分数的成员,其中国家ID = 10

我无法在MongooseJS中找到合适的文档。

我在StackOVerflow(这是MongoDB代码)

中找到了这个
Model.findOne({ field1 : 1 }).sort(last_mod, 1).run( function(err, doc) {
     var max = doc.last_mod;
});

但我如何将其翻译成MongooseJS?

5 个答案:

答案 0 :(得分:31)

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

    // your callback code

  });

检查the mongoose docs for querying,它们非常好。

如果你不想再次编写相同的代码,你也可以在你的会员模型中添加一个静态方法,如下所示:

memberSchema.statics.findMax = function (callback) {

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

稍后通过Member.findMax(callback)

进行调用

答案 1 :(得分:9)

您不需要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)

答案 2 :(得分:5)

使用find()而不是findOne()可能faster

使用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]

});

答案 3 :(得分:1)

使用Mongoose查询助手可以快速简便地进行操作。

一般形式为:

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

tldr: 这将为您提供单个项目的数组,其值在“ field_to_sort_by”中最高。不要忘记像我一个小时一样将其作为数据[0]进行访问。

wind大步:逐步了解该功能字符串在做什么...

Your_Model.find()开始查询,不需要args。

.sort("-field_to_sort_by")按降序对所有内容进行排序。字段名称前面的减号指定按降序排序,您可以将其丢弃以按升序排序,从而获得最小值的文档。

.limit(1)告诉数据库仅返回第一个文档,因为我们只需要排名靠前的文档。

.exec( (error,data) => someFunc(error,data) {...} )最后将任何错误和包含文档的数组传递到函数中。您将在data[0]

中找到您的文档

答案 4 :(得分: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 } ]
});