简体   繁体   English

MongoDB如何在Java驱动程序3.4版中编写聚合查询

[英]MongoDb how write aggregation query in java driver version 3.4

I'm not getting the way to write the equivalent query in java for driver version 3.4 of this aggregation query: 我没有办法在Java中为此聚合查询的驱动程序版本3.4编写等效查询:

db.getCollection('MYTABLE').aggregate([ 
     {"$match": { "ID_STATUSMATRICULA": 1 } }, 
     {"$group": {
        "_id": null,
        "TOTAL" : { $sum: 1 },

        "MEDIA_APROVADOS": { 
            "$avg": {
                "$cond": [ { "$eq": [ "$ID_STATUSAPROVEITAMENTO", 1 ] }, "$NR_APROVEITAMENTO", 0, ]
            }
        },
        "MEDIA_REPROVADOS": { 
            "$avg": {
                "$cond": [ { "$eq": [ "$ID_STATUSAPROVEITAMENTO", 2 ] }, "$NR_APROVEITAMENTO", 0, ]
            }
        },
        "APROVADOS": { 
            "$sum": {
                "$cond": [ { "$eq": [ "$ID_STATUSAPROVEITAMENTO", 1 ] }, 1, 0, ]
            }
        },
        "REPROVADOS": { 
            "$sum": {
                "$cond": [ { "$eq": [ "$ID_STATUSAPROVEITAMENTO", 2 ] }, 1, 0, ]
            }
        },
        "PENDENTES": { 
            "$sum": {
                "$cond": [ { "$eq": [ "$ID_STATUSAPROVEITAMENTO", 0 ] }, 1, 0, ]
            }
        }
    }}
])

Anyone can help me with this ? 有人可以帮助我吗? I found many samples for old driver 2.2, but very poor documentation for 3.4 version. 我发现了许多旧驱动程序2.2的示例,但是3.4版本的文档却很差。


SOLVED After Sagar Reddy answer, I can write the equivalent in java: 解决了Sagar Reddy的答案之后,我可以用Java编写等效的代码:

List pma = asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 1)), "$NR_APROVEITAMENTO", 0);
List pmr = asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 2)), "$NR_APROVEITAMENTO", 0);
List psa = asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 1)), 1, 0);
List psr = asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 2)), 1, 0);
List psp = asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 0)), 1, 0);

        Bson match = Aggregates.match(Filters.eq("ID_STATUSMATRICULA", 1));
        Bson group = Aggregates.group(null,
            sum("TOTAL", 1),
            avg("MEDIA_APROVADOS", computed("$cond", pma) ),
            avg("MEDIA_REPROVADOS", computed("$cond", pmr) ),
            sum("APROVADOS", computed("$cond", psa) ),
            sum("REPROVADOS", computed("$cond", psr) ),
            sum("PENDENTES", computed("$cond", psp) )
        );

        AggregateIterable<Document> cursor = mTable.aggregate(asList(match, group));

You can try something like. 您可以尝试类似的方法。 Add the rest of fields to the $group aggregation similar as MEDIA_APROVADOS 将其余字段添加到$group聚合中,类似于MEDIA_APROVADOS

import static com.mongodb.client.model.Accumulators.*;
import static com.mongodb.client.model.Aggregates.*;
import static com.mongodb.client.model.Projections.*;
import static java.util.Arrays.asList;

Bson match = Aggregates.match(Filters.eq("ID_STATUSMATRICULA", 1));
Bson group = group(null,
                avg("MEDIA_APROVADOS", 
                computed("$cond", 
                         asList(new Document("$eq", asList("$ID_STATUSAPROVEITAMENTO", 1)), 
                        "$NR_APROVEITAMENTO", 0))
                 )
           );
collection.aggregate(asList(match, group));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM