首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中将包含$cond的聚合转换为DBObject

在java中将包含$cond的聚合转换为DBObject
EN

Stack Overflow用户
提问于 2017-03-18 20:34:55
回答 1查看 1.7K关注 0票数 0

我已经在MongoDB中构建了一个聚合

代码语言:javascript
复制
{
    "$project": {
        "dt": "$dt",
        "mc": "$mc",
        "uplift": "$uplift",
        "baseAvg": "$baseAvg",
        "baseUp":  { $add: [ "$uplift", "$baseAvg" ] },
        "share": {
            "$cond": [{
                "$eq": ["$baseAvg", 0]
            }, 0, {
                "$divide": ["$uplift", "$baseAvg"]
            }]
        }
    } 
}

我试图使用DBObject构建查询,因为没有支持条件的ProjectOperation。但我被困住了。

当我写这个的时候:

代码语言:javascript
复制
ArrayList condArray = new ArrayList();
        condArray.add(new BasicDBObject("$eq", new DBObject[] { new BasicDBObject("$baseAvg", 0) }));
        condArray.add(0);
        condArray.add(new BasicDBObject("$divide", new DBObject[] { new BasicDBObject("$uplift", "$baseAvg") }));

        DBObject doc = new BasicDBObject("$baseAvg", 0);


        DBObject operation = new BasicDBObject("$project",
                new BasicDBObject(groupItem, "$_id." + groupItem)   
                .append("mc", "$mc")
                .append("uplift", "$uplift")
                .append("baseAvg", "$baseAvg")
                .append("sumBaseUp", new BasicDBObject("$add", new DBObject[] {"$uplift", "$baseAvg"}))
                .append("share", new BasicDBObject("$cond", condArray)));

我得到了这样的结果:

代码语言:javascript
复制
{
    "$project": {
        "dt": "$dt",
        "mc": "$mc",
        "uplift": "$uplift",
        "baseAvg": "$baseAvg",
        "sumBaseUp": {
            "$add": [{
                "$uplift": "$baseAvg"
            }]
        },
        "share": {
            "$cond": [{
                "$eq": [{
                    "$baseAvg": 0
                }]
            }, 0, {
                "$divide": [{
                    "$uplift": "$baseAvg"
                }]
            }]
        }
    }
}

有人知道我该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-18 21:14:10

您可以对MOGOJava2.13版本使用下面的聚合查询。我简化了一些操作。

代码语言:javascript
复制
 List<DBObject> aggregates = Arrays.asList(new BasicDBObject("$project", new BasicDBObject("dt", "$dt").
            append("mc", "$mc").
            append("uplift", "$uplift").
            append("baseAvg", "$baseAvg").
            append("baseUp", new BasicDBObject("$add", Arrays.<Object>asList("$uplift", "$baseAvg"))).
            append("share", new BasicDBObject("$cond", Arrays.<Object>asList(new BasicDBObject("$eq", Arrays.<Object>asList("$baseAvg", 0)),
                    0, new BasicDBObject("$divide",  Arrays.<Object>asList("$uplift", "$baseAvg")))))));

对于3.x版本,您可以使用下面的聚合。

代码语言:javascript
复制
 MongoClient mongoClient = new MongoClient();
 MongoDatabase db = mongoClient.getDatabase("db");
 MongoCollection<Document> collection = db.getCollection("collection");
 Bson aggregates = Aggregates.project(Projections.fields(Projections.include("dt", "mc", "uplift","baseAvg"),
               new Document("baseUp", new Document("$add", Arrays.<Object>asList("$uplift", "$baseAvg"))),
               new Document("share", new Document("$cond", Arrays.<Object>asList(new Document("$eq", Arrays.<Object>asList("$baseAvg", 0)),
                                        0, new Document("$divide",  Arrays.<Object>asList("$uplift", "$baseAvg")))))));
 List<Document> results = collection.aggregate(Arrays.asList(aggregates)).into(new ArrayList<>());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42879552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档