2017-04-26 2 views
0

Ich habe eine Sammlung processedClickLog in MongoDB.

{ 
     "_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": 
     .... 
} 

Ich versuche, eine komplexe Abfrage in Java auszuführen. Meine Frage ist processedClickLog Sammlung zu erhalten, wo

  1. TAB nicht gleich People-Tab
  2. DOCRANK ist nicht gleich 0
  3. nur return "USERID", "DOCID", "DOCRANK", „QUERY "Felder
  4. Gruppe von USERID

Unten ist mein Java-Code. Ich bin in der Lage, die ersten drei Bedingungen zu erfüllen. Aber ich bin auf 4. Bedingung fest, die Gruppe von USERID ist.

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(); 
    } 

Wie soll ich meine ganze Abfrage definieren, um die Bedingung "Gruppe von USERID" in Java hinzuzufügen? Jede Hilfe wird geschätzt

Antwort

1

Sie müssen Aggregation Framework verwenden. Importieren Sie alle Methoden der Hilfsklassen statisch und verwenden Sie den folgenden Code.

Die Verwendung von BasicDBObject ist in neueren 3.x-Treiber-API nicht erforderlich. Sie sollten die neue Klasse Document für ähnliche Zwecke verwenden.

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(); 

Projektionsstufe ist optional, nur hinzugefügt, um ein vollständiges Beispiel zu geben.

Mehr über Aggregation hier https://docs.mongodb.com/manual/reference/operator/aggregation/

+0

Dank. Ich werde das versuchen und Sie wissen lassen – Rose

+0

Arbeitete wie ein Charme. Vielen Dank – Rose

+0

Kannst du kurz den Gruppenteil erklären? Ich habe nichts in Bezug auf den Referenzlink gefunden. – Rose