Java 春季数据未汇总季度业绩

Java 春季数据未汇总季度业绩,java,mongodb,mongodb-query,aggregation-framework,spring-data-mongodb,Java,Mongodb,Mongodb Query,Aggregation Framework,Spring Data Mongodb,我不熟悉Mongodb和spring数据,我参考了这个stackoverflow链接和这个链接,并在下面构建了这个代码片段,用于检索Mongodb中的季度销售报告: String pipeline = "{$project:{_id:1,'unitsSold':1,'dateSold':1,'results': 1 , 'productName': 1, 'year':{$year:['$dateSold']}, "+ "'quarter':{$cond:[{$lte

我不熟悉Mongodb和spring数据,我参考了这个stackoverflow链接和这个链接,并在下面构建了这个代码片段,用于检索Mongodb中的季度销售报告:

String pipeline =   "{$project:{_id:1,'unitsSold':1,'dateSold':1,'results': 1 ,
  'productName': 1, 'year':{$year:['$dateSold']},    "+
       "'quarter':{$cond:[{$lte:[{$month:'$dateSold'},3]},"+
                         "'first'," +
                         "{$cond:[{$lte:[{$month:'$dateSold'},6]},"+
                                 "'second',"+
                                 "{$cond:[{$lte[{$month:'$dateSold'},9]},"+"'third',"+
                                         "'fourth']}]}]}}},"+
"{$group:{'_id':{ 'year':'$year', 'quarter':'$quarter'},  
'unitsSold': { $sum: '$unitsSold' },'results':{$push:'$$ROOT'}}}";



 DBObject operation = (DBObject)JSON.parse (pipeline);

TypedAggregation<SampleReport> aggregation =newAggregation(SampleReport.class,
new DBObjectAggregationOperation(operation)
);

AggregationResults<SampleReport> result =mongoTemplate.aggregate(aggregation, SampleReport.class);
List<SampleReport> list = result.getMappedResults();
for(SampleReport r : list)
            {
                System.out.println (r.getProductName() + " : " + r.getUnitsSold() + " : " + r.getQuarter() +":: "+r.getYear());
            }
String pipeline=“{$project:{u id:1,'unitsSold':1,'datesell':1,'results':1,
'productName':1,'year':{$year:['$DateSelled']}+
“'quarter':{$cond:[{$lte:[{$month:'$DateSelled'},3]},”+
“‘第一’,”+
{$cond:[{$lte:[{$month:'$datesell'},6]}+
“‘第二’,”+
“{$cond:[{$lte[{$month:'$datesell'},9]},”+“'third',”+
“'fourth']}]}]}}},”+
“{$group:{''U id':{'year':'year','quarter':'quarter'},
'unitsSold':{$sum:'$unitsSold'},'results':{$push:'$$ROOT'}};
DBObject操作=(DBObject)JSON.parse(管道);
TypedAggregation聚合=新聚合(SampleReport.class,
新建DBObjectAggregationOperation(操作)
);
AggregationResults=mongoTemplate.aggregate(聚合,SampleReport.class);
List List=result.getMappedResults();
用于(采样器端口r:列表)
{
System.out.println(r.getProductName()+”:“+r.getUnitsSold()+”:“+r.getQuarter()+”::“+r.getYear());
}
问题不在于总结售出的单位。请告诉我spring数据哪里出了问题。但是这个查询使用robomongo获得所需的结果

问候


Kris

如果你说它在另一个客户机上有效,那么很可能在交易中丢失了一些东西。这里有些东西你当然可以清理一下,让它更简单

我可以推荐一种更有效的“数学”方法来确定当前季度,而不是当前嵌套的条件语句,好像没有其他方法可以使事情变得更干净一样。除了“效率”之外,你不应该仅仅在一个阶段之前使用,在这个阶段,简单地将所有东西组合到一个阶段是合乎逻辑的:

[
{“$组”:{
“_id”:{
“年”:{“$year”:“$datesell”},
“季度”:{
“$add”:[
{“$subtract”:[
{“$divide”:[{“$subtract”:[{“$month”:“$datesell”},1]},3]},
{“$mod”:[
{“$divide”:[{“$subtract”:[{“$month”:“$datesell”},1]},3]},
1.
]}
]},
1.
]
}
},
“unitsSold”:{“$sum”:“$unitsSold”}
}}
]
无论如何,如果您确实需要,请添加您的
“$push”:“$$ROOT”
,但减少涉及的逻辑并将所有内容放在一个符合逻辑的管道阶段,这在很大程度上是重点

下一个阶段是,我强烈建议您以本机方式编写此代码。虽然可能会有人认为您可以使用JSON符号,但您会发现,随着时间的推移,这既不灵活,也不能提供很好的可读性来放置长字符串并依赖于解析它们。此外,您通常会希望在某个阶段内插局部变量

Aggregation=newAggregation(
新CustomGroupOperation(
新的BasicDBObject($group),
新的BasicDBObject(“\u id”,
新BasicDBObject(“年”,新BasicDBObject(“年,$DateSelled”))
.append(“季度”),新的基本对象(
“$add”,Arrays.asList(
新的BasicDBObject(“$subtract”,Arrays.asList)(
新的BasicDBObject(“$divide”,Arrays.asList)(
新的BasicDBObject(“$subtract”,Arrays.asList)(
新BasicDBObject(“$month”,“$datesell”),
1.
)),
3.
)),
新的BasicDBObject(“$mod”,Arrays.asList)(
新的BasicDBObject(“$divide”,Arrays.asList)(
新的BasicDBObject(“$subtract”,Arrays.asList)(
新BasicDBObject(“$month”,“$datesell”),
1.
)),
3.
)),
1.
))
)),
1.
)
))
)
.append(“unitsSold”,新的基本对象(“$sum”,“$unitsSold”))
)
)
);
您似乎还抽象了一些其他代码,但我个人更喜欢以一种不会与在
newAggregation
构造中使用其他spring mongo聚合帮助程序冲突的方式实现
CustomGroupOperation

公共类CustomGroupOperation实现聚合操作{
私有对象操作;
公共CustomGroupOperation(DBObject操作){
这个操作=操作;
}
@凌驾
公共数据库对象toDBObject(聚合操作上下文){
返回context.getMappedObject(操作);
}
}
但正如最初所述,如果您得到一个
0
结果,那么它是字段命名或“类型”,其中字段的名称不同,或者实际上是一个字符串。但是,相同的语句应该以类似的方式在任何其他客户机中失败,唯一的补救办法是根据需要修改命名或“类型”

这无疑是一种“更干净”的方法。“数学”对于指数化季度来说是合理的,甚至可以适用于其他“金融”领域