Spring Data MongoDB:MergeOperation返回整个集合。为什么?

6

我正在运行MongoDB聚合操作,最后一个阶段是$merge,它将某些字段写入另一个集合中。基本上,这个$merge应该只对单个文档产生影响(这就是为什么我们有on:"_id")。

以下是我在Java中执行它的方式:

var merge = Aggregation.merge().intoCollection("items")
                .on("_id")
                .whenMatched(MergeOperation.WhenDocumentsMatch.mergeDocuments())
                .whenNotMatched(MergeOperation.WhenDocumentsDontMatch.discardDocument())
                .build();

var agg = Aggregation.newAggregation(match, group, merge);
var aggResult = mongoTemplate.aggregate(agg, "prices", Item.class);
  

聚合操作已经实现了其所需的功能,我能看到请求的文档已经改变,但问题是aggregate()返回集合中的所有文档,这是一个主要的缺陷,当集合足够大时,不会有很好的扩展性。
如何更改查询使其只返回已更改的文档。如果无法实现,则只应用查询而不返回任何内容。

显然,您对Spring实现的Aggregation Pipeline操作做出了一些错误的假设。在这里,您称之为问题,但实际上它是按设计返回结果的,根据定义,这不是问题,而是功能。正如您所发现的,一个选项可以关闭数据的返回(skipOutput()),该选项包含在在线文档中(https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/aggregation/AggregationOptions.Builder.html#skipOutput--)。您的问题似乎带有敌意,这很少有帮助。 - barrypicker
2
@barrypicker,感谢您的评论,但我很震惊您认为我的问题是敌对的。我甚至为未来读者提供了一个答案。顺便说一下,当我从MongoDB IDE运行相同的查询时,我收到了一个消息,表示查询成功运行,但没有返回任何输出,因此我认为聚合API存在不一致的问题。 - IsaacLevon
这让我疯了,浪费了整整一天的工作时间。我的聚合操作以某种合并方式结束,在Robo3T中却没有返回结果,只是默默地执行它的任务。我甚至将聚合操作限制在小批量处理,但仍然导致我的应用程序因为庞大的未使用结果数据集而内存溢出。幸好我最终找到了.skipOutput选项。对于这种情况,应该直接提供一个没有返回类型的mongoTemplate.aggregate方法。真是个大坑啊... - Ralf
1个回答

6

我找到了答案,将会分享给未来的读者:

mongoTemplate.aggregate(aggregation.withOptions(newAggregationOptions().skipOutput().allowDiskUse(true).build()), "collectionNme", EntityClass.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接