Java 在项目后使用Spring mongo group进行聚合时未找到正确的字段

Java 在项目后使用Spring mongo group进行聚合时未找到正确的字段,java,spring,mongodb,Java,Spring,Mongodb,我有一个集合,其数据集如下所示: { "resource" : "10.10.10.10", "statistics" : { "connections" : 17 } } { "resource" : "10.10.10.10", "statistics" : { "connections" : 24 } } { "_id" : "10.10.10.10", "statTotals" : [ 17, 24 ] }

我有一个集合,其数据集如下所示:

{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 17
    }
}
{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 24
    }
}
{ "_id" : "10.10.10.10", "statTotals" : [ 17, 24 ] }
{ "aggregate" : "event" , "pipeline" : [ { "$project" : { "resource" : 1 , "total" : "$statistics.connections"}} , { "$group" : { "_id" : "$resource" , "statTotals" : { "$push" : "$statistics.connections"}}}]}
我想使用Mongo的$group/$push机制返回如下数据集:

{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 17
    }
}
{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 24
    }
}
{ "_id" : "10.10.10.10", "statTotals" : [ 17, 24 ] }
{ "aggregate" : "event" , "pipeline" : [ { "$project" : { "resource" : 1 , "total" : "$statistics.connections"}} , { "$group" : { "_id" : "$resource" , "statTotals" : { "$push" : "$statistics.connections"}}}]}
在Mongo shell中,我可以通过以下方式实现:

db.testcol.aggregate([ { "$project" : { "resource" : 1 , "total" : "$statistics.connections"}} , { "$group" : { "_id" : "$resource" , "statTotals" : { "$push" : "$total"}}} ])
现在我想用Spring的Mongo数据解决方案在Java中实现这一点。我当前尝试使用的操作有:

ProjectionOperation projOper = Aggregation.project("resource").and("statistics.connections").as("total");
GroupOperation groupOper = Aggregation.group("resource").push("total").as("statTotals");
不幸的是,这将生成一个管道,看起来像:

{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 17
    }
}
{
    "resource" : "10.10.10.10",
    "statistics" : {
        "connections" : 24
    }
}
{ "_id" : "10.10.10.10", "statTotals" : [ 17, 24 ] }
{ "aggregate" : "event" , "pipeline" : [ { "$project" : { "resource" : 1 , "total" : "$statistics.connections"}} , { "$group" : { "_id" : "$resource" , "statTotals" : { "$push" : "$statistics.connections"}}}]}
在$group中,$push是针对$statistics.connections而不是$total执行的,因此结果返回为空


在这方面任何帮助都将不胜感激。起初我认为可能是这样,但我尝试使用1.7.2和1.8.1,得到了相同的结果。

这有什么不好的?不管怎样,你应该自己做的事情是正确的。
$project
将在管道中增加效率,这似乎被正确地作为优化删除。您的代码无论如何都应该这样做。不幸的是,它生成了一个中断的管道。是的,我同意初始项目是有效的,可以删除,但如果我们选择在那里添加项目,我仍然希望它不会创建一个损坏的管道。MongoDb聚合管道操作有一个错误。因此,我认为MongodB重塑了聚合管道以提高性能。这似乎发生在春季,甚至在Mongo出现之前。该集团本应推动$total,因为这是管道第一部分预计的。相反,尽管它被$statistics.connections替换,但由于管道第一部分中的项目,它仍然不存在。这会导致statTotals响应中不返回任何数据。@hecnabae虽然MongoDB在发送到服务器后确实会在内部进行优化,但实际上spring mongo在将请求发送到服务器之前也会这样做。但认为这是“破坏”的说法是不正确的。这实际上是应该“最佳地”做的事情。这是我们在这里要吸取的教训。