我正在使用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?
答案 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 } ]
});