2017-08-18 2 views
2

Ich benutze den Java-Treiber für mongo-db und versuche, mit BasicBObjectBuilder mehrere Abfragekriterien hinzuzufügen. Ich habe ein Textfeld, in dem ein XML als String gespeichert wird, so dass wir Regex verwenden, um die Abfrage zu bilden.BasicDBObjectBuilder fügt mehrere Kriterien für ein einzelnes Objekt nicht an

Unten ist meine Abfrage und die Ausgabe erhalte ich:

regexQuery.put("REQUEST_XML",BasicDBObjectBuilder 
.start("$regex", ".*Main>[\r\n]<.?.?.?.?action>"+MainValue+".*") 
.add("$regex", ".*Details>[\r\n]<.?.?.?.?action>" + DetailValue+ ".*").get()); 
regexQuery.put("NAME", "Video"); 

Was ich als Abfrage bekommen ist:

{ "REQUEST_XML" : { "$regex" : ".*Details>[\r\n]<.?.?.?.?action>Change.*"} , "NAME" : "Video"} 

Der erste Teil mit .start ("$ regex", " Haupt> [\ r \ n] <.?.?.?.? Action> "+ MainValue +". ") wird nicht zur Abfrage hinzugefügt.

Können Sie bitte lassen Sie mich wissen, was das Problem ist?

Antwort

2

Sie überschreiben das Schlüsselwertpaar. "$regex", ".*Details>[\r\n]<.?.?.?.?action>" + DetailValue+ ".*" überschreibt "$regex", ".*Main>[\r\n]<.?.?.?.?action>"+MainValue+".*".

Verwenden Sie $or, um beide Regex-Ausdrücke zu übergeben.

So etwas wie

BasicDBObject regexQuery = new BasicDBObject(); 
regexQuery.put("$or", Arrays.asList(new BasicDBObject("REQUEST_XML", new BasicDBObject("$regex", ".*Main>[\r\n]<.?.?.?.?action>"+".*")), 
       new BasicDBObject("REQUEST_XML", new BasicDBObject("$regex", ".*Details>[\r\n]<.?.?.?.?action>"+".*")))); 
regexQuery.put("NAME", "Video"); 

Dies sollte eine Ausgabe Abfrage wie

{ "$or" : [{ "REQUEST_XML" : { "$regex" : ".*Main>[\r\n]<.?.?.?.?action>.*" } }, { "REQUEST_XML" : { "$regex" : ".*Details>[\r\n]<.?.?.?.?action>.*" } }], "NAME" : "Video" } 

Mit 3.x Treiber

import static com.mongodb.client.model.Filters.or; 
import static com.mongodb.client.model.Filters.regex; 
Bson regexQuery = or(regex("REQUEST_XML", ".*Main>[\r\n]<.?.?.?.?action>"+".*"), regex("$regex", ".*Details>[\r\n]<.?.?.?.?action>"+".*")); 
+0

Sie haben mich dieses Mal gerettet :) Ich habe $ und Operator verwendet und es funktioniert wie ein Zauber. Aufgrund von mehr als 20 Lakh-Datensätzen dauert die Abfrage jedoch mehr als 3 Minuten. Gibt es eine Möglichkeit, die Abfragezeit auf weniger als eine Minute zu optimieren? –

Verwandte Themen