2017-04-26 4 views
0

MongoDB에서 processedClickClick 콜렉션이 있습니다.

{ 
     "_id" : ObjectId("58ffb4cefbe21fa7896e2d73"), 
     "ID" : "81a5d7f48e5df09c9bc006e7cc89d6e6", 
     "USERID" : "206337611536", 
     "DATETIME" : "Fri Mar 31 17:29:34 -0400 2017", 
     "QUERYTEXT" : "Tom", 
     "DOCID" : "www.demo.com", 
     "TITLE" : "Harry Potter", 
     "TAB" : "People-Tab", 
     "TOTALRESULTS" : "1", 
     "DOCRANK" : 1 
} 
{  "id": 
     .... 
} 

java에서 복잡한 쿼리를 실행하려고합니다.

  1. TAB가 동일하지 않은 경우 내 쿼리 processedClickLog 수집을 얻을 수 있습니다 사람들 탭
  2. DOCRANK 0
  3. 만 반환 "USERID", "DOCID", "DOCRANK", "QUERYTEXT 같지 않은 "

USERID하여 필드

  • 그룹 다음은 내 자바 코드입니다. 나는 처음 세 가지 조건을 만족시킬 수있다. 그러나 나는 USERID에 의해 그룹 인 4 번째 조건에 붙어있다.

    String jsonResult = ""; 
         MongoClient mongoClient = new MongoClient("localhost", 27017); 
         MongoDatabase database = mongoClient.getDatabase("test1"); 
         MongoCollection<Document> collection = database.getCollection("processedClickLog"); 
         //add condition where TAB is not equal to "People-Tab" and DOCRANK is not equal to 0 
         List<DBObject> criteria = new ArrayList<DBObject>(); 
         criteria.add(new BasicDBObject("DOCRANK", new BasicDBObject("$ne", 0))); 
         criteria.add(new BasicDBObject("TAB", new BasicDBObject("$ne", "People-Tab"))); 
    
          //combine the above two conditions 
          BasicDBObject query = new BasicDBObject("$and", criteria); 
          //to retrieve all the documents with specific fields 
          MongoCursor<Document> cursor = collection.find(query) 
            .projection(Projections.include("USERID", "DOCID", "DOCRANK", "QUERYTEXT")).iterator(); 
         try { 
           while (cursor.hasNext()) { 
            System.out.println(cursor.next().toJson()); 
    
           } 
          } finally { 
           cursor.close(); 
          } 
          System.out.println(hashMap); 
          mongoClient.close(); 
        } 
    

    Java에서 "group by USERID"조건을 추가하려면 전체 쿼리를 어떻게 정의해야합니까? 어떤 도움을 주신다면

  • 답변

    1

    집계 프레임 워크를 사용해야합니다. 정적으로 헬퍼 클래스의 모든 메서드를 가져오고 아래 코드를 사용하십시오.

    최신 3.x 드라이버 API에서는 BasicDBObject을 사용할 필요가 없습니다. 유사한 요구 사항에 대해 새 클래스 Document을 사용해야합니다.

    import static com.mongodb.client.model.Accumulators.*; 
    import static com.mongodb.client.model.Aggregates.*; 
    import static java.util.Arrays.asList; 
    import static com.mongodb.client.model.Filters.*; 
    import static com.mongodb.client.model.Projections.*; 
    
    Bson match = match(and(ne("DOCRANK", 0), ne("TAB", "People-Tab"))); 
    Bson group = group("$USERID", first("USERID", "$USERID"), first("DOCID", "$DOCID"), first("DOCRANK", "$DOCRANK"), first("QUERYTEXT", "$QUERYTEXT")); 
    Bson projection = project(fields(include("USERID", "DOCID", "DOCRANK", "QUERYTEXT"), excludeId())); 
    MongoCursor<Document> cursor = collection.aggregate(asList(match, group, projection)).iterator(); 
    

    투영 단계는 선택 사항입니다. 완전한 예를 들면 추가 할 수 있습니다.

    여기에서 집계에 대한 자세한 내용 https://docs.mongodb.com/manual/reference/operator/aggregation/

    +0

    감사합니다. 나는 이것을 시도하고 알려 줄 것입니다. – Rose

    +0

    매력처럼 작동했습니다. 고마워요 – Rose

    +0

    그룹 부분에 대해 간단히 설명 할 수 있습니까? 참조 링크에서 그와 관련된 내용을 찾지 못했습니다. – Rose