복붙노트

[MONGODB] 자바 드라이버 MongoDB를 집계

MONGODB

자바 드라이버 MongoDB를 집계

나는 자바 드라이버로 MongoDB의 통합 프레임 워크를 사용하는 당신의 도움이 필요합니다. 난이 설명서와 함께, 내 요청을 작성하는 방법을 이해하지 않습니다.

나는 내 컬렉션에서 모든 항목에서 200 오래된 전망을 싶어. 여기에 (I 콘솔 모드에서 원하는처럼 작동) 내 몽고 쿼리는 다음과 같습니다

db.myCollection.aggregate(
    {$unwind : "$views"},
    {$match : {"views.isActive" : true}},
    {$sort : {"views.date" : 1}},
    {$limit : 200},
    {$project : {"_id" : 0, "url" : "$views.url", "date" : "$views.date"}}
)

이 컬렉션의 항목은 하나 또는 여러 전망이 있습니다. 내 질문 요청 결과에 대해 아니다, 나는 자바 syntaxe을 알고 싶어요.

해결법

  1. ==============================

    1.마지막으로 해결책을 발견, 나는 원래 요청보다 같은 결과를 얻을.

    마지막으로 해결책을 발견, 나는 원래 요청보다 같은 결과를 얻을.

    집계 문서

    MongoCollection<Document> collection = database.getCollection("myCollection");
    
    AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
            new Document("$unwind", "$views"),
            new Document("$match", new Document("views.isActive", true)),
            new Document("$sort", new Document("views.date", 1)),
            new Document("$limit", 200),
            new Document("$project", new Document("_id", 0)
                        .append("url", "$views.url")
                        .append("date", "$views.date"))
            ));
    
    // Print for demo
    for (Document dbObject : output)
    {
        System.out.println(dbObject);
    }
    

    당신은 고정 수입에 더 읽기 쉽게 만들 수 있습니다 : 정적 com.mongodb.client.model.Aggregates를 가져. * ;. COMPLET 예를 들어 koulini 대답을 참조하십시오.

    집계 문서

    Iterable<DBObject> output = collection.aggregate(Arrays.asList(
            (DBObject) new BasicDBObject("$unwind", "$views"),
            (DBObject) new BasicDBObject("$match", new BasicDBObject("views.isActive", true)),
            (DBObject) new BasicDBObject("$sort", new BasicDBObject("views.date", 1)),
            (DBObject) new BasicDBObject("$limit", 200),
            (DBObject) new BasicDBObject("$project", new BasicDBObject("_id", 0)
                        .append("url", "$views.url")
                        .append("date", "$views.date"))
            )).results();
    
    // Print for demo
    for (DBObject dbObject : output)
    {
        System.out.println(dbObject);
    }
    

    쿼리 변환 로직 : 이 링크에 감사드립니다

  2. ==============================

    2.그것은 당신이 크게 MongoDB를위한 자바 집계 방법을 사용하여, 여기에 대한 답변으로 표시된 코드를 향상시킬 수 있다는 지적 가치가있다.

    그것은 당신이 크게 MongoDB를위한 자바 집계 방법을 사용하여, 여기에 대한 답변으로 표시된 코드를 향상시킬 수 있다는 지적 가치가있다.

    코드 예제로하자 걸릴 자신의 질문에 대한 영업 이익의 대답.

    AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
            new Document("$unwind", "$views"),
            new Document("$match", new Document("views.isActive", true)),
            new Document("$sort", new Document("views.date", 1)),
            new Document("$limit", 200),
            new Document("$project", new Document("_id", 0)
                        .append("url", "$views.url")
                        .append("date", "$views.date"))
    ));
    

    다음과 같이 우리는 위의 코드를 다시 작성할 수 있습니다;

    import static com.mongodb.client.model.Aggregates.*;
    
    AggregateIterable output = collection.aggregate(Arrays.asList(
                    unwind("$views"),
                    match(new Document("views.isActive",true)),
                    sort(new Document("views.date",1)),
                    limit(200),
                    project(new Document("_id",0)
                            .append("url","$views.url")
                            .append("date","$views.date"))
    ));
    

    물론, 당신이 해당 정적 가져 오기를해야합니다하지만 그 이상, 두 번째 예제의 코드가 청소기, 안전이 더 읽기 및 IMO 더 아름다운, (당신은 사업자 자신의 모든 시간을 입력하지 않는 한).

  3. ==============================

    3.가이드로 앞의 예를 사용하여, 여기 몽고 드라이버 3를 사용하여 수행하는 방법은 다음과 같습니다

    가이드로 앞의 예를 사용하여, 여기 몽고 드라이버 3를 사용하여 수행하는 방법은 다음과 같습니다

    MongoCollection<Document> collection = database.getCollection("myCollection");
    AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
        new Document("$unwind", "$views"),
        new Document("$match", new Document("views.isActive", true))
    ));
    
    for (Document doc : output) {
        ...
    }
    
  4. ==============================

    4.여기 departmentId에 의해 직원을 계산하는 간단한 방법입니다 .. 자바 API를 사용하여 집계 :에서 세부 사항

    여기 departmentId에 의해 직원을 계산하는 간단한 방법입니다 .. 자바 API를 사용하여 집계 :에서 세부 사항

            Map<Long, Integer> empCountMap = new HashMap<>();
    
            AggregateIterable<Document> iterable = getMongoCollection().aggregate(Arrays.asList(
                    new Document("$match",
                            new Document("active", Boolean.TRUE)
                                    .append("region", "India")),
                    new Document("$group",
                            new Document("_id", "$" + "deptId").append("count", new Document("$sum", 1)))));
    
            iterable.forEach(new Block<Document>() {
                @Override
                public void apply(final Document document) {
                    empCountMap.put((Long) document.get("_id"), (Integer) document.get("count"));
                }
            });
    
  5. from https://stackoverflow.com/questions/31643109/mongodb-aggregation-with-java-driver by cc-by-sa and MIT license