2017-08-18 87 views
2

我正在为mongo-db使用Java驱动程序,并尝试使用BasicDBObjectBuilder添加多个查询条件。我有一个文本字段,其中的XML存储为字符串,所以我们使用正则表达式来形成查询。BasicDBObjectBuilder没有为单个对象添加多条条件

下面是我的查询和输出我得到:

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

我所得到的查询是:

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

,第一部分用。开始(“$正则表达式”,“ Main> [\ r \ n] <。?。?。?action>“+ MainValue +”。“)不会被添加到查询中。

您能否让我知道是什么问题?

回答

2

您正在覆盖键值对。 "$regex", ".*Details>[\r\n]<.?.?.?.?action>" + DetailValue+ ".*"将覆盖"$regex", ".*Main>[\r\n]<.?.?.?.?action>"+MainValue+".*"

使用$or来传递这两个正则表达式。

喜欢的东西

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

这应该输出查询像

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

使用3.x的驱动程序

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

你有这样的时候救了我:)我已经使用$和运营商它就像一个魅力。但由于超过20万条记录,查询运行超过3分钟。有没有办法将查询运行时间优化为不到一分钟? –