2016-04-15 8 views
0

Ich arbeite an Java und MongoDb 3.0 und mit einer Abfrage, die ich in Java-Code konvertieren möchte.Umwandlung von MongoDB3.0 Abfrage zu Java

Mongo DB-Abfrage ist wie folgt:

db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] }) 

Java-Abfrage für diese würde wie unten sein.

List<Document> orqueryList = new ArrayList<Document>(); 
    List<String> list1 = new ArrayList<String>(); 
    list1.add("90:200"); 
    list1.add("350:400"); 
    list1.add("560:700"); 

    Document greaterQuery = new Document(); 
    Document lessQuery = new Document(); 
    Document lEQuery = new Document(); 
    Document gEQuery = new Document(); 

    for (String time : list1) { 

     String[] updatedAtt = tim.split(":"); 


     gEQuery.put("$gte", Long.parseLong(updatedAtt[0])); 
     lEQuery.put("$lte", Long.parseLong(updatedAtt[1])); 


     greaterQuery.put("updated_at", gEQuery); 
     lessQuery.put("updated_at", lEQuery); 
      orqueryList.add(greaterQuery); 
      orqueryList.add(lessQuery); 

     } 
    query.put("$or", orqueryList); 

Aber das funktioniert nicht wie meine orqueryList Liste gibt mir Größe 3 mit letzten Werte wie unten

[Dokument {{received_at_server = Dokument {{$ gte = 560}}}}, Dokument {{received_at_server = Dokument {{$ lte = 700}}}}, Dokument {{received_at_server = Dokument {{$ gte = 560}}}}, Dokument {{received_at_server = Dokument {{$ lte = 700}} }}, Dokument {{received_at_server = Dokument {{$ gte = 560}}}}, Dokument {{received_at_server = Dokument {{$ lte = 700}}}}]

Antwort

1
db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] }) 

Die Abfrage besteht aus zwei Teilen - 1. UND-Verknüpfung für updated_at Wert $ gt und $ lte 2. ODER-Verknüpfung für die Liste der oben und im Betrieb.

greaterQuery.put("updated_at", gEQuery); 
    lessQuery.put("updated_at", lEQuery); 
    orqueryList.add(greaterQuery); 
    orqueryList.add(lessQuery); 

    } 
    query.put("$or", orqueryList); 

Ihr über Java-Code überprüft nur für ODER-Bedingung (die Liste orqueryList). Sie fügen die Bedingung $ gt und $ lte der OR-Bedingung selbst hinzu.

Versuchen Sie, die folgende Logik:

Document query = new Document(); 
List<String> list1 = new ArrayList<String>(); 
List<Document> andQueryList = new ArrayList<Document>(); 
list1.add("90:200"); 
list1.add("350:400"); 
list1.add("560:700"); 

for (String time : list1) { 
    String[] updatedAtt = time.split(":"); 

    andQueryList.add(new Document("$and", Arrays.asList(new Document("updated_at", new Document("$gte", Long.parseLong(updatedAtt[0]))), 
       new Document("updated_at", new Document("$lte", Long.parseLong(updatedAtt[1])))))); 
} 
query.put("$or", andQueryList); 

Die Abfrage Ausgabe lautet wie folgt (entspricht Mongo Abfrage)

Dokument {{$ oder = [Dokument {{$ und = [Dokument { {updated_at = Dokument {{$ gte = 90}}}}, Dokument {{updated_at = Dokument {{$ lte = 200}}}}}}, Dokument {{$ und = [Dokument {{updated_at = Dokument {{$ gte = 350}}}}, Dokument {{updated_at = Dokument {{$ lte = 400}}}}}}, Dokument {{$ und = [Dokument {{updated_at = Do cument {{$ gte = 560}}}}, {{ Dokument updated_at = Dokument {{$ lte = 700}}}}]}}]}}

+0

@Roshan Quadras Aber es gibt mir jetzt letzten Wert . Wie es den letzten Wert in das Dokument überschreibt. Dokument {{$ oder = Dokument {{$ und = [Dokument {{aktualisierter_at = Dokument {{$ gte = 560}}}}, Dokument {{updated_at = Dokument {{$ lte = 700}}}}}}}} } – Kamini

+0

@Kamini Die andQuery-Referenz zeigte auf den letzten Wert, da wir das Listenobjekt innerhalb der for-Schleife neu erstellen. Ich habe das Abfrage-Snippet aktualisiert, das das erwartete Ergebnis ausgibt. –