Mongoose / mongodb – 每个ID只获取最新的logging
我有mongoose的检测模型:
var InspectionSchema = new Schema({ business_id: { type: String, required: true }, score: { type: Number, min: 0, max: 100, required: true }, date: { type: Number, // in format YYYYMMDD required: true }, description: String, type: String }); InspectionSchema.index({business_id: 1, date: 1}, {unique: true});
对同一个业务可能有多个检查(每个业务由一个唯一的business_id表示)。 但是,每个商家每天都有一次检查的限制,这就是为什么business_id +date有唯一的索引。
我还在Inspection对象上创build了一个静态方法,在给定business_ids列表的情况下,检索所有基础业务的检查。
InspectionSchema.statics.getAllForBusinessIds = function(ids, callback) { this.find({'business_id': {$in: ids}}, callback); };
该function获取所请求业务的所有检查。 不过,我也想创build一个只读取每个business_id 的最新检查的函数。
InspectionSchema.statics.getLatestForBusinessIds = function(ids, callback) { // query to get only the latest inspection per business_id in "ids"? };
我该如何去执行这个?
您可以使用.aggregate()
方法来获取一个请求中的所有最新数据:
Inspection.aggregate( [ { "$sort": { "buiness_id": 1, "date": -1 } }, { "$group": { "_id": "$business_id", "score": { "$first": "$score" }, "date": { "$first": "$date" }, "description": { "$first": "$description" }, "type": { "$first": "$type" } }} ], function(err,result) { } );
只需$sort
$group
然后$group
与“business_id”作为分组键。 $first
一个从分组边界获得第一个结果,我们已经在每个id中按datesorting。
如果你只是想要date,那么使用$max
来做:
Inspection.aggregate( [ { "$group": { "_id": "$business_id", "date": { "$max": "$date" } }} ], function(err,result) { } );
另外如果你想在这个过程中“预过滤”业务ID值或者其他任何条件,请参阅$match
。
尝试这个:
Inpection.aggregate( [ { $match : { _id : { "$in" : ids} } }, { $group: { "_id" : "$business_id", lastInspectionDate: { $last: "$date" } } } ], function(err,result) { } );