mongodb 聚合计算total

4 篇文章 0 订阅

mongodb bson 命令 (我算是发现了,查询的key加不加引号都可以)

db.your_db.aggregate([
    {
        $match: {
            
            "$and": [{
                "companyAwards": {
                    "$elemMatch": {
                        
                        $and: [{
                           
                            "awardLevel": {
                                "$in": ["国家级","省部级"]
                            }
                        }]
                    }
                }
            }]
        }
    },
    {
        $group: {
            "_id": null,
            "total": {
                "$sum": 1
            }
        }
    }
])

Java Bson 查询方式

public long calculateTotal(List<String> levels) {

    BasicDBObject allQueryObject = new BasicDBObject();

    List<BasicDBObject> elemMathDBObjects = new ArrayList<>() ;
    List<BasicDBObject> totalAndDBObjects = new ArrayList<>() ;

    totalAndDBObjects.add(new BasicDBObject("awardLevel",new BasicDBObject("$in",levels)));

    elemMathDBObjects.add(new BasicDBObject(new BasicDBObject("companyAwards",
                        new BasicDBObject(QueryOperators.ELEM_MATCH,new BasicDBObject("$and",totalAndDBObjects)))));

    allQueryObject.put("$and", elemMathDBObjects);

    Bson totalGroup  = Aggregates.group("null"
                ,new BsonField("total",new BasicDBObject("$sum", 1))
        );

    List<Bson> totalBsonList = new ArrayList<>();

    totalBsonList.add(Aggregates.match(allQueryObject));
    totalBsonList.add(totalGroup);

    AggregateIterable<Document> totalAgg = MongodbUtils.aggregate("your_db",totalBsonList);

    MongoCursor<Document> totalIterable = totalAgg.iterator();

    long total = 0 ;
    if (totalIterable.hasNext()){
        Document document = totalIterable.next();
        total = document.getInteger("total");
    }
    
    return total ;
}

java spring 模板查询(未验证,因为用spring模板时,速度不如Bson方式,所以此处大致写了一下,没有运行)

public void method(List<String> levels) {

    Aggregation aggregation = newAggregation(
             
        match(Criteria.where("companyAwards").elemMatch(Criteria.where("awardLevel").in(levels))),
        count().as("total")

    );

    AggregationResults<JSONObject> result = MongodbUtils.find(JSONObject.class,aggregation,"your_db");
        respDto.setData(result.getMappedResults());
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值