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

Java Mongo DB聚合管道-$sum在使用$unwind时不起作用?

东弘扬
2023-03-14

我目前正在我的一个Java脚本中开发mongoDB聚合管道。

输入数据可以简化为不同客户的订单列表。例如:

_id、customerId和orderId是字符串,金额是一个Long类型的数字,装运是名为shipping的自定义类的实体。现在,我想汇总这些数据,并显示每个customerId的总花费和所有发货量。对于第一位客户:

{CusterId:123,发货:[发货1,发货2,发货4],金额:50.00}

json格式的数据

[
 {
   "_id": 1,
   "customerId": 123,
   "orderId": "a12b4",
   "shipments": ["shipment1","shipment2"],
   "amount": 30
 },
 {
   "_id": 2,
   "customerId": 456,
   "orderId": "a14hf",
   "shipments": ["shipment3"],
   "amount": 40
 },
 {
   "_id": 3,
   "customerId": 123,
   "orderId": "a27jd",
   "shipments": ["shipment4"],
   "amount": 20
 }
]

所以,我这样做了:

Aggregates.unwind("$shipments"),
Aggregates.group("$customerId",
     Accumulators.sum("amount","$amount"),
     Accumulators.addToSet("shipments", "$shipments")),
Aggregates.out("test_output")

这就是我的问题所在:放松和求和的用法是排他性的吗?

只要我保留unwind语句,sum函数就不会返回正确的结果。但只要我用另一个我不需要解开的字段替换发货,它就可以正常工作。

任何提示都将不胜感激。

共有1个答案

慕容念
2023-03-14

查询

  • 展开将创建许多重复项,但您不需要它

普雷蒙戈

aggregate(
[{"$group": 
   {"_id": "$customerId",
    "shipments": {"$push": "$shipments"},
    "total-amound": {"$sum": "$amount"}}},
 {"$set": 
   {"shipments": 
     {"$setUnion": 
       [{"$reduce": 
           {"input": "$shipments",
            "initialValue": [],
            "in": {"$concatArrays": ["$$value", "$$this"]}}}, []]}}}])
 类似资料:
  • 我需要汇总以下记录中的所有标记: https://gist.github.com/sbassi/5642925 (这个片段中有2个样本记录)并按大小对它们进行排序(首先是出现频率更高的标记)。但是我不想考虑具有特定“user_id”的数据(比方说,2,3,6和12)。 以下是我的尝试(只是聚合,没有过滤和排序): db。用户库。聚合({$unwind:“$annotations.data.tags

  • 我搜索了类似的问题,但没有找到任何问题。请随时为我指出他们的方向。 假设我有这个数据: 如果我想获取每个属性组的最新记录,我可以这样做: 我想让我的数据按属性分组,然后按id排序,这样每个组中只保留最新的记录,这就是我可以做到的。但我需要一种方法来避免在结果中命名我想要的所有字段(在本例中为“name”),因为在我的实际用例中,它们在前面是未知的。 那么,有没有办法做到这一点,但不必使用$last

  • 我想知道如何在Elasticsearch中使用聚合时获得具有最高doc_count的存储桶。我正在使用Kibana示例数据kibana_sample_data_flights: 如果有一个存储桶具有最大文档计数,我可以将术语聚合的大小设置为1,但是如果有两个存储桶具有相同的最大文档计数,则这不起作用。 自从我涉足管道聚合以来,我觉得应该有一种简单的方法来实现这一点。最大桶聚合似乎能够处理多个最大桶

  • 在今天的任务中,我尝试在一个集合中聚合文档(我们称之为集合1),在管道的一个阶段中,我尝试使用$lookup从另一个集合中检索文档(我们称之为集合2)。 收集1对象模型: 收集2对象模型: 我正试图做的是从集合2的where字段3中检索文档。字段31等于集合1的值。 我的$查找阶段看起来像这样,但目前似乎不起作用。我没有发现任何线索,如果这应该工作,但期待着你的答复。 我希望避免拥有一个项目或一个

  • 我有两个集合。如果集合2中的1号和2号在集合1中指定的一定范围内,我正在尝试将集合2的文档添加到集合1中。集合1中的FYI ObjectId和集合2中的ObjectId指的是两个不同的项目/产品,因此我无法在此id上加入两个集合。 集合1中的示例文档: 集合2中的示例文档: 我想要输出: 我认为使用管道的查找阶段可以工作。我的代码当前如下: 但是运行上面的没有给我输出。我做错了什么吗??

  • 我想在JAVA API中编写elasticsearch聚合代码,以查找字段折叠和结果分组。 json聚合代码如下所示,我从elasticsearch文档中获得了这些代码 “dedup\u by\u score”聚合具有称为“top\u hit”聚合的子聚合,并将此聚合用于桶排序。 我想将这个json查询转换为JAVA 这是我已经在JAVA中尝试过的 但是我从Elasticsearch得到了如下错误