聚合管道
说明
对应 SDK 方法: aggregate。
以下示例要求 orders 中的 status 为字符串、amount 为数值:
String command = """
db.orders.aggregate([
{$match: {status: ?}},
{$group: {_id: '$customerId', total: {$sum: '$amount'}}},
{$sort: {total: -1, _id: 1}},
{$limit: 10}
], {allowDiskUse: true, maxTimeMS: 5000})
""";
try (PreparedStatement ps = conn.prepareStatement(command)) {
ps.setString(1, "paid");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("_JSON"));
}
}
}
服务端先筛选已付款订单,再按 customerId 汇总 amount、排序并返回前 10 组。$group 输出中的 _id 是分组键,不是订单主键;聚合自身不保证排序,参阅MongoDB $group。结果中的 total 不是独立 JDBC 列,应从 _JSON 中解析。
如需将结果映射到实体或直接调用 getBigDecimal("total"),在管道末尾添加 {$project: {_id: 0, customerId: '$_id', total: 1}},并保持默认 preRead=true。
聚合选项支持 allowDiskUse、batchSize、maxTimeMS、maxAwaitTimeMS、bypassDocumentValidation、collation、comment、hint。batchSize 控制 SDK 每批取数条数,不限制驱动最终缓存的结果总量。hint 是索引提示对象,不是分页 Hint。分页需在管道中显式加入 $skip、$limit。