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

问题描述 投票:0回答:1

我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将该管道与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代码以创建所需的管道阶段?

java mongodb mongodb-java
1个回答
0
投票

我找到了解决方案。我需要将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))
);
© www.soinside.com 2019 - 2024. All rights reserved.