如下:
经过过滤后,再分组,两个字段为分组条件。
但是,我只想获取分组内时间,即fdate为最大的那条数据
如何能做到??
db.SEC_2018_05_12.aggregate([{ $match : { fyear : { $eq : 2018},fmonth:{$eq : 5},fday:{$eq : 12},fhour:{$eq : 17},fmin:{$eq : 8} } }
, { $group: { _id: {dev_id: "$dev_id", data_id: "$data_id"},maxTimeValue: { $max: "$fdate" } } } ]).pretty()
如果能给些测试条件别人会更容易理解你的问题。
首先说$eq,这个运算符大部分时候没有必要写。所以你的查询等价于:
然后你的要求是取到第一条数据,而不仅仅是最大那个
fdate
值。可以换个思路来理解这个问题:按照这个思路,查询应该是:
最后说说数据模型设计的问题。
$match
这里其实就是一个时间,但是被你拆成了很多部分来存储。除非有明确的理由支持,个人并不是十分赞成这样的做法。$match
/$sort
需要索引的支持,所以原来一个索引现在将会变成5个字段的联合索引,同样是浪费空间和效率;在数据量大的情况下,上面的查询是需要索引支持的。换你现在的写法,索引应该是:
看上去就够惊悚了不是吗?但其实前面那一堆时间本身只是一个时间而已。