mongoose得到最高的价值的关键

这是我的模式

var schema = new mongoose.Schema({ key: String, value: Number }, { timestamps: true }); 

我有这样的条目(我收集不同的统计)

 var entry1 = { key: "subscribers", value: 100 } var entry2 = { key: "online", value: 105 } 

我试图得到每个关键所有时间的高价值。 现在我有这个:

 var now = new Date(); var startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()); db.getConnection().model("MaxValue").aggregate([{ "$match": { createdAt: { $gte: startOfToday } } }, { "$group": { "_id": "$key", "value": { "$max": "$value" }, } }], function(err,result) { resolve(result) }) 

但是我也想获得创build的date也是为了这个值,因为我想知道什么时候logging了这个值。

这不是那么容易,因为$ max是一个累加器,所以你不能直接把这个date看成是结果。 所以我们不得不增加更多的stream水线阶段。 幸运的是,我们有$ addToSet运算符,所以我们可以为每个组添加自定义转换。

所以在分组之后,每个组仍然应该包含与值配对的date。 然后我们分别处理每个项目。 接下来我们可以设置新的字段来区分这个文件是否包含组中的最大值。 如果string相等, $ cmp操作符将把这个字段设置为0。 最后在最后阶段,我们可以过滤掉没有最大值的文档。

 db.maxValues.aggregate([ { "$group": { "_id": "$key", "value": { "$max": "$value" }, "values": { "$addToSet" : { "value": "$value", "createdAt": "$createdAt" }} } }, { "$unwind": "$values" }, { "$project": { "_id": 0, "key": "$_id", "value": 1, "createdAt": "$values.createdAt", "compared": { "$cmp": ["$value", "$values.value"] } } }, { "$match": { "compared": 0 } } ])