mongdb的聚合函数
**aggregate 需要过滤的所有条件集合**
List<Document> aggregate = Lists.newArrayList();
**$project 当前表格需要显示的字段 字段**
Document pro1 = DocumentLib.newDoc();
pro1.put("containerCode",1);
pro1.put("gridArr",1);
pro1.put("sortingState",1);
pro1.put("currState",1);
pro1.put("containerStatus",1);
pro1.put("inbound_time",1);
pro1.put("distinguishState",1);
pro1.put("first_end_time",1);
aggregate.add(DocumentLib.newDoc("$project",pro1));
**$lookup 连表的关键字**
Document lookup = DocumentLib.newDoc();
lookup.put("from","warehouse_tray");
lookup.put("localField","containerCode");
lookup.put("foreignField","containerCode");
lookup.put("as","tray");
aggregate.add(DocumentLib.newDoc("$lookup",lookup));
**$addFields 连表获取到需要添加到当前表里面的字段关键字**
Document addFields1 = DocumentLib.newDoc();
addFields1.put("trayNumber",DocumentLib.newDoc("$first","$tray.trayNumber"));
addFields1.put("oneGenre",DocumentLib.newDoc("$first","$tray.oneGenre"));
aggregate.add(DocumentLib.newDoc("$addFields",addFields1));
Document pro2 = DocumentLib.newDoc("tray",0);
aggregate.add(DocumentLib.newDoc("$project",pro2));
**$unwind 把list扁平为一条一条数据 关键字**
Document unwind1 = DocumentLib.newDoc("$unwind","$gridArr");
aggregate.add(unwind1);
Document addFields2 = DocumentLib.newDoc("bloodinfo","$gridArr.bloodInfo.bloodName");
aggregate.add(DocumentLib.newDoc("$addFields",addFields2));
**$match 添加需要过滤的条件 关键字**
Document match1 = DocumentLib.newDoc();
match1.put("bloodinfo",DocumentLib.newDoc("$ne",null));
match1.put("distinguishState","已分型");
match1.put("oneGenre","储血区");
aggregate.add(DocumentLib.newDoc("$match",match1));
**$toDouble 转换为Double类型关键字**
aggregate.add(DocumentLib.newDoc("$addFields",DocumentLib.newDoc("capacity",DocumentLib.newDoc("$toDouble","$gridArr.capacity"))));
if (StringLib.isNotEmpty(rh)){
if (StringLib.equals(rh,"1") || StringLib.equals(rh,"+")){
rh = "+";
}else if (StringLib.equals(rh,"2") || StringLib.equals(rh,"-")){
rh = "-";
}
aggregate.add(DocumentLib.newDoc("$match",DocumentLib.newDoc("gridArr.bloodInfo.Rh",rh)));
}
Document group1 = DocumentLib.newDoc();
group1.put("_id",DocumentLib.newDoc("bloodName","$gridArr.bloodInfo.bloodName")
.append("bloodType","$gridArr.bloodInfo.bloodType")
.append("capacity","$capacity"));
group1.put("count",DocumentLib.newDoc("$sum",1));
group1.put("freeCount",DocumentLib.newDoc("$sum",
DocumentLib.newDoc("$cond",
Lists.newArrayList(DocumentLib.newDoc("$eq",Lists.newArrayList("$sortingState","")),1,0))));
group1.put("containers",
DocumentLib.newDoc("$addToSet",DocumentLib.newDoc("containerCode","$containerCode")
.append("sortingState","$sortingState")
.append("trayNumber","$trayNumber")
.append("inbound_time","$inbound_time")
.append("first_end_time","$first_end_time")));
aggregate.add(DocumentLib.newDoc("$group",group1));
Document sort = DocumentLib.newDoc();
sort.put("_id.bloodType",1);
aggregate.add(DocumentLib.newDoc("$sort",sort));
**$group分组做统计的关键字**
Document group2 = DocumentLib.newDoc();
group2.put("_id",DocumentLib.newDoc("bloodName","$_id.bloodName")
.append("capacity","$_id.capacity"));
**$sum汇总$count的总和**
group2.put("count",DocumentLib.newDoc("$sum","$count"));
group2.put("freeCount",DocumentLib.newDoc("$sum","$freeCount"));
**$push添加数据到type里面的关键字**
group2.put("type",DocumentLib.newDoc("$push",
DocumentLib.newDoc("containers","$containers")
.append("bloodType","$_id.bloodType")
.append("count","$count")
.append("freeCount","$freeCount")));
aggregate.add(DocumentLib.newDoc("$group",group2));
Document addFields3 = DocumentLib.newDoc();
addFields3.put("bloodName","$_id.bloodName");
addFields3.put("capacity","$_id.capacity");
aggregate.add(DocumentLib.newDoc("$addFields",addFields3));
aggregate.add(DocumentLib.newDoc("$sort",DocumentLib.newDoc("capacity",1)));
aggregate.add(DocumentLib.newDoc("$match",DocumentLib.newDoc("bloodName",DocumentLib.newDoc("$ne",""))));
**主表QContainer.collectionName,aggregate 上面统计的所有条件**
List<Document> res = DBUtils.aggregate(QContainer.collectionName,aggregate);
需要详细了解的 聚合函数