MongoDB聚合分组后如何对组内重复数据按date字段排序
MongoDB聚合分组保留排序顺序去重解决方案
你当前方案失效的核心原因是$addToSet是集合类型算子,本身不保留元素插入顺序,即便前置了$sort排序,分组阶段$addToSet也会打乱原有顺序生成无序列表,无法保证数组首位是最早的记录。
推荐解决方案(兼容性最佳)
改用$push算子替代$addToSet即可:$push会严格按照输入顺序将元素追加到数组,只要提前按日期完成升序排序,分组生成的unique_ids数组就会天然按旧记录到新记录的顺序排列。且MongoDB的_id是默认全局唯一主键,不会出现重复值,完全可以替代$addToSet的去重作用。
修改后的聚合代码如下:
issue = collection.aggregate([ # 第一步:按日期升序排序,保证旧记录在前 {'$sort': {'date': 1}}, # 第二步:分组,用$push替代$addToSet保留排序顺序 {'$group': { '_id': { 'FeatureName': '$FeatureName', 'ExposureTime': '$exp1', 'Joint1': '$J1', 'Joint2': '$J2', 'Joint3': '$J3', 'Joint4': '$J4', 'Joint5': '$J5', 'Joint6': '$J6', 'Joint7': '$J7' }, 'unique_ids': {'$push': '$_id'}, 'count': {'$sum': 1} }}, # 第三步:过滤出有重复的分组 {'$match': {'count': {'$gt': 1}}} ]) # 后续处理逻辑保持不变即可:数组第一位是最早的记录,剩余全部加入待删列表 for matches in issue: del matches['unique_ids'][0] for i in matches['unique_ids']: remove.append(i)
内容的提问来源于stack exchange,提问作者NicPy4
相关产品推荐
相关产品推荐

