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) { } );