当前位置: 首页 > 知识库问答 >
问题:

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

彭衡
2023-03-14

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

集合中$组阶段之前的数据如下所示:

{
 year: 2020,
 month: 01,
 day: 01,
 prodName: "productXY",
 actionName: "actionXY"
}

$组阶段应返回以下数据结构:

{
  _id: {
    year: 2020,
    month: 01,
    day: 01,
    prodName: "productXY",
    actionName: "actionXY"
  },
  actionCount: 50
}

问题所在

Mongo Compass按预期预览了阶段的结果,但使用java驱动程序的阶段的结果非常不同。它只返回1个文档(而不是预期的20个),并且只返回字段actionCount。

问题是

如何更改java代码以创建所需的管道阶段?

共有1个答案

严子默
2023-03-14

我找到了解决办法。我需要将和操作符更改为投影。字段运算符。我还是不知道为什么。也许其他人可以对此进行详细说明。

因此,工作查询如下所示:

collectionName.aggregate(
  Arrays.asList(
    group(fields(eq("year", "$year"),
                 eq("month", "$month"),
                 eq("day", "$day"),
                 eq("prodName", "$prodName"),
                 eq("actionName", "$actionName")),
         sum("actionCount", 1))
);
 类似资料:
  • 问题内容: 我正在尝试使用JDBC驱动程序将android应用程序连接到服务器(PostgreSQL),但是出现此错误: 我尝试了很多事情,例如在路径中添加驱动程序的地址,但没有任何效果。我遵循了本教程:http : //appliedcoffeetechnology.tumblr.com/post/10657124340,并在构建路径中添加了驱动程序JDBC4(我也尝试过JDBC3)。 每个人都

  • 问题内容: 我有一个包含三个字段(所有字符串类型)的“报告”对象列表- 我有一个排序代码,就像 由于某种原因,我没有排序顺序。一个建议在字段之间放置空格,但是为什么呢? 你认为代码有什么问题吗? 问题答案: 你认为代码有什么问题吗? 是。为什么在比较它们之前将三个字段加在一起? 我可能会做这样的事情:(假设字段按照你希望对其进行排序的顺序)

  • 在下面的查询中 如何将id{success:'$success',responseCode:'$responseCode',label:'$label},转换为在java mongodb驱动程序中使用。 我试过了 和 多维数组 等 但结果总是这样 如果我只使用一个字段,它就会工作。 DBObject groupFields=new BasicDBObject(“\u id”,new BasicDB

  • 对于InterClient7.5.1和8.1.5,在Java8中创建新的JDBC连接失败 此类似乎被InterClientJDBC库引用或使用。Java7不会发生错误。是否有方法解决此错误? 此代码重现了Java 8上的问题: 输出: interbase.interclient.Connection处线程“main”java.lang.NoClassDefFoundError:sun/io/Byt

  • 我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个

  • 问题内容: 我有一个用例,需要加载单独的角度应用程序。 基于几个堆栈溢出问题和这个google线程,它是可行的。但是,我无法使其正常工作。 查看文档: http://docs.angularjs.org/api/angular.bootstrap 看来您需要提供该元素(在该元素上获得句柄的正确方法是什么?),然后如何将其绑定回config,controller等。这如何与路由一起使用?IE碰撞如何