[英]mongodb Java Driver - $group with multiple fields
我的目標是使用聚合框架創建一個管道來對我的數據進行分組,然后將此管道與 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 個 Document(而不是預期的 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))
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.