今天,我遇到了个在mongo中 group后 count(distinct f1)
的需求。 备注:f1 代表某字段
大意是: 根据key1 分组后,找出该组中字段 f1的不重复数量
1. mysql实现
- 伪sql如下:(这个挺简单的)
sql select key1, count(distinct f1) from t group by key1
2. mongo如何实现呢?
mongo实现如下: ``` db.t.aggregate([ {$match: { createTime: { $gte: 1, $lt: 8888888888888888 } }}, { '$group': { "_id": {'key1':'$key1'}, f1DistinctCount:{$addToSet:"$f1"}, successCount: { $sum: { $cond: [ { $and: [ { $eq: ['$successOrFail', 1] }] }, 1, 0 ] } }, failCount: { $sum: { $cond: [ {$and: [ { $eq: ['$successOrFail', 0] }] }, 1, 0 ]
} } },
}, { '$project': { '_id': 1, 'key1':1,'successCount': 1, 'failCount': 1,'f1DistinctCount':1 } } ],{allowDiskUse: true}); ```
f1DistinctCount是一个set集合 如果你使用mongotemplate的话 他是个 com.mongodb.BasicDBList 集合,取出集合的长度即得到我想要的结果了
当然如果你有更好的方式,欢迎交流讨论一起学习。