MongoTemplate聚合 – 按日期分组

我正在尝试使用mongotemplate创建聚合查询,其中按日期(即2016-03-01)而不是datetime(即2016-03-01 16:40:12)进行分组。 dateToString操作存在于mongodb文档中,它可用于使用格式化从日期时间中提取日期: https : //docs.mongodb.org/manual/reference/operator/aggregation/dateToString/但我得到了它可以使用它mongotemplate – 我得到一个NullPointerException。 (我的db版本是3.2)

 List aggregationOperations = new ArrayList(); aggregationOperations.add( Aggregation.project("blabla", ...). andExpression("dateToString('%Y-%m-%d',timeCreated).as("date")); aggregationOperations.add(Aggregation.group("date").sum("blabla").as("blabla")); AggregationResults aggregationResults = this.mongoTemplate.aggregate( Aggregation.newAggregation(aggregationOperations), collectionName, resultClass); 

当我使用dayOfMonth(timeCreated)来提取日期时,没有例外,但是我找不到如何使用dateToString进行此操作的示例。 我尝试没有”作为日期格式,它也没有工作……

这是我得到的例外:

 java.lang.NullPointerException at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:226) at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194) at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255) at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194) at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255) at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194) at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255) at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:324) at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:263) at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194) at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:136) at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:36) at com.mongodb.OutMessage.putObject(OutMessage.java:289) at com.mongodb.OutMessage.writeQuery(OutMessage.java:211) at com.mongodb.OutMessage.query(OutMessage.java:86) at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:81) at com.mongodb.DB.command(DB.java:320) at com.mongodb.DB.command(DB.java:299) at com.mongodb.DB.command(DB.java:374) at com.mongodb.DB.command(DB.java:246) at org.springframework.data.mongodb.core.MongoTemplate$2.doInDB(MongoTemplate.java:357) at org.springframework.data.mongodb.core.MongoTemplate$2.doInDB(MongoTemplate.java:355) at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:442) at org.springframework.data.mongodb.core.MongoTemplate.executeCommand(MongoTemplate.java:355) at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1497) at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1432) 

编辑:

最后我们在这里决定采用与下面建议不同的解决方案,我在这里写它以防其他人发现它有用:

除了保存日期时间的“timeCreated”字段外,我们还在文档中保存了另一个字段:“date”,它只包含日期(长度)。

例如,如果“timeCreated”=“2015-12-24 16:36:06.657 + 02:00”,则日期为“2015-12-24 00:00:00”,我们保存1449180000000.现在我们可以简单地分组按“日期”。

您可以尝试首先使用投影操作中的SpEL andExpression表达式投影字段,然后按组操作中的新字段进行分组:

 Aggregation agg = newAggregation( project() .andExpression("year(timeCreated)").as("year") .andExpression("month(timeCreated)").as("month") .andExpression("dayOfMonth(timeCreated)").as("day"), group(fields().and("year").and("month").and("day")) .sum("blabla").as("blabla") ); AggregationResults result = mongoTemplate.aggregate(agg, collectionName, BlaBlaModel.class); List resultList = result.getMappedResults();