首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Java代码从AggregationOutput更改为DBCollection聚合方法

将Java代码从AggregationOutput更改为DBCollection聚合方法
EN

Stack Overflow用户
提问于 2018-08-06 10:34:17
回答 1查看 562关注 0票数 0

我正在用最新的库更新一个2014年的Java项目,MongoDB Java驱动程序从3.0改为3.6。大多数代码已经更新,但是有一个特定的查询非常复杂,这给我带来了问题。

文件是这样的

代码语言:javascript
复制
{
    "_id" : ObjectId("58750a67ae28bc28e0705b0f"),
    "info": "description",
    "parentId", "variable-id-here"
    "issues": [
        {"name": "a", "closed": true},
        {"name": "b", "closed": false},
        {"name": "c", "closed": true}
    ],
    "bugs": [
        {"name": "d", "closed": false},
        {"name": "e", "closed": false},
        {"name": "f", "closed": true}
    ],
    "errors": [
        {"name": "g", "closed": true},
        {"name": "h", "closed": true},
        {"name": "i", "closed": false}
    ]
}

(即使数组中的元素相似,也不能用额外的“类型”键将它们分组到文档中的单个数组中,其中包含值问题、错误、错误,但这不是重点)

原来的剧本就是这个

代码语言:javascript
复制
List<DBObject> aggregators = new ArrayList<>();
DBObject match = new BasicDBObject("$match", new BasicDBObject("parentId", myId));
DBObject project = new BasicDBObject();
List<String> domains = Arrays.asList("issues", "bugs", "errors");

for (Iterator<String> d = domains.iterator(); d.hasNext();) {
    String domain = d.next();
    //Reset values
    aggregators = new ArrayList<>();
    // Define MongoDB "$project" to find 'true' values on 'closed' flags
    project = new BasicDBObject("$project", new BasicDBObject("closedProblems", 
        new BasicDBObject("$filter",
            new BasicDBObject("input", "$"+domain)
                .append("as", "myObject")
                .append("cond", new BasicDBObject("$eq",
                    Arrays.<Object> asList("$$myObject.closed", true)
                )
            )
        )
    ));

    aggregators.add(match);
    aggregators.add(project);
    //db defined before. AggregationOutput is deprecated so must be changed
    AggregationOutput output = db.getCollection("myColl").aggregate(aggregators);

    // Now I can iterate results
    for (DBObject result : output.results()) {
        // ...
    }
}

我试图使用项目、表达式等,但我找不到一种方法来用新的聚合方法复制MongoDB项目。

最后的结果应该使用mongoTemplate.anyMethods来执行聚合,以便加入新的项目指南。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 12:45:27

在3.6驱动程序中使用下面的代码。

代码语言:javascript
复制
DBCursor output = (DBCursor) db.getCollection("myColl").aggregate(aggregators, AggregationOptions.builder().build());
for (Iterator<DBObject> r = output.iterator(); output.hasNext();) {
      DBObject result = r.next();
      ...
}

更新:

代码语言:javascript
复制
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.aggregation.*;

List<AggregationOperation> aggregators;
MatchOperation match = Aggregation.match(Criteria.where("parentId").is(myId));
List<String> domains = Arrays.asList("issues", "bugs", "errors");
for (Iterator<String> d = domains.iterator(); d.hasNext();) {
     String domain = d.next();
     aggregators = new ArrayList<>();
     ProjectionOperation project = project().and(filter(domain)
                        .as("myObject")
                        .by(valueOf(
                                "myObject.closed")
                                .equalToValue(
                                       true)))
                        .as("closedProblems");
     aggregators.add(match);
     aggregators.add(project);
     Aggregation aggregation = newAggregation(aggregators).withOptions(newAggregationOptions().cursor(new Document()).build());
     AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "myColl", Document.class );
     for (Document result : results) {
                    // ...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51705658

复制
相关文章

相似问题

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