【问题标题】:mongodb Java Driver - $group with multiple fieldsmongodb Java 驱动程序 - 具有多个字段的 $group
【发布时间】:2020-09-25 05:36:23
【问题描述】:

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

【问题讨论】:

  • Compass 为聚合的 group 阶段生成的 Java 代码看起来正确 - 没有问题。

标签: java mongodb mongodb-java


【解决方案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))
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2016-12-23
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多