簡體   English   中英

mongodb Java 驅動程序 - 具有多個字段的 $group

[英]mongodb Java Driver - $group with multiple fields

我的目標是使用聚合框架創建一個管道來對我的數據進行分組,然后將此管道與 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 個 Document(而不是預期的 20 個)並且只返回字段actionCount

問題

如何更改 java 代碼以創建所需的流水線階段?

我找到了解決方案。 我需要將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))
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM