mongodb的聚合函数的用法

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);

需要详细了解的 聚合函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值