之前我们用户的组团记录是push到数组中的,这样会有很多问题,比如一直push如果数据太多了导致超过16M时mongo时查询不出来的。所以现在优化是需要把数组中每个元素拆出来放到集合中。
之前aggregation统计组团数据时的代码和数据如下:
现在拆分后的数据如下:
所以需要从写个统计逻辑的代码:
开始打算group操作之后通过ConditionalOperators返回1或者0来给sum求和算出统计结果。所以测试代码和结果如下:
问题:可以对比上面统计数组和下面统计文档的结果不一样。periodCond中通过startDate过滤文档时没有生效。
方案:需要用BooleanOperatiors来构造And对象来作为ConditionalOperators.when()的参数并列条件才会生效。
如下打开之前注释的代码来验证下:
结果也是证实了上面问题的方案
然后我该了groupId的参数,再原先groupId后面+“1”传入无效groupId时
可以看到之前数组结构时传入groupId无效也会统计出结果,原因在于
operations.add(Aggregation.project(CommonConstant.ID).and(citFilter).as(UserConstant.GROUP_RECORD_EO).and(periodFilter)
.as("period").and(maxFilter).as("max").and(sponsorFilter).as("sponsor"));
我以为citFilter会过滤数组后然后periodFilter再去过滤后的数组中过滤来作为新字段period,看测试结果显然不是这样的,Filter之前是互不影响的。所以我从写的方法中应该取消groupId来过滤的条件,然后group后push到数组中最后用stream流过滤下groupId就可以了,