我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将该管道与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))
);