gpt4 book ai didi

java - mongodb Java 驱动程序 - 具有多个字段的 $group

转载 作者:行者123 更新时间:2023-12-01 16:22:50 26 4
gpt4 key购买 nike

我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将此管道与 java 驱动程序一起使用。MongoDB v4.0.3

我使用 MongoDB Compass 创建了以下管道(简化为重要部分):

[{
$group: {
_id: {
year: '$year',
month: '$month',
day: '$day',
prodName: '$prodName',
actionName: '$actionName'
},
actionCount: {
$sum: 1
}
}
}
]

这产生了以下(生成的)Java 代码:

collectionName.aggregate(
Arrays.asList(
group(and(eq("year", "$year"),
eq("month", "$month"),
eq("day", "$day"),
eq("prodName", "$prodName"),
eq("actionName", "$actionName")),
sum("actionCount", 1))
);

集合中$group阶段之前的数据如下所示:

{
year: 2020,
month: 01,
day: 01,
prodName: "productXY",
actionName: "actionXY"
}

$group 阶段应返回以下数据结构:

{
_id: {
year: 2020,
month: 01,
day: 01,
prodName: "productXY",
actionName: "actionXY"
},
actionCount: 50
}

问题

Mongo Compass 预览阶段的结果符合预期,但是使用 java 驱动程序的阶段结果有很大不同。它仅返回 1 个文档(而不是预期的 20 个),并且仅返回字段 actionCount

问题

我如何更改 java 代码才能创建所需的管道阶段?

最佳答案

我找到了解决方案。我需要将 and 运算符更改为 Projections.fields 运算符。我还是不知道为什么。也许其他人可以详细说明这一点。

所以工作查询如下所示:

collectionName.aggregate(
Arrays.asList(
group(fields(eq("year", "$year"),
eq("month", "$month"),
eq("day", "$day"),
eq("prodName", "$prodName"),
eq("actionName", "$actionName")),
sum("actionCount", 1))
);

关于java - mongodb Java 驱动程序 - 具有多个字段的 $group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62225054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com