有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (1) 个答案

  1. # 1 楼答案

    我找到了解决办法。 我需要将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))
    );