我正在尝试用mongo + java中的$ regex编写$ in查询。它也不适用于mongo shell。我的意思是我没有得到任何结果,但也没有查询解析错误。
这是我从Java调试器获得的最后一个查询,在我说collection.find(finalQuery)
的行
`
{ "$and" : [
{ "$or" :
[ { "country" : "united states"}]} ,
{ "businesses" :
{ "$in" : [ { "$regex" : "^.*cardinal.*health.*$"} , { "$regex" : "^.*the.*hartford.*$"}]}
}
]
}
Java Code snipet for Above query:
设置business = new HashSet();
for(String st: srchTerms){
businesses.add(Pattern.compile("^"+st.trim()+"$"));
}
srchTermQuery.append("businesses", new BasicDBObject("$in", businesses ));
` 但是,以下查询在mongo shell中工作但我不知道如何将其写入java:
{"registering_organization" : {"$in":[/^.*cardinal.*health.*$/,/^.*the.*hartford.*$/]}}
如果我们尝试将其定义为字符串,那么Java代码会在正则表达式周围添加双引号。
答案 0 :(得分:3)
您所看到的行为可能是一个错误,但作为替代方案,您可以像这样编写查询
Pattern pattern = Pattern.compile("(^aaa$)|(^bbb$)");
srchTermQuery.append("businesses", pattern);
不漂亮,但似乎有把戏
答案 1 :(得分:2)
你无法转换:
{"businesses" : {"$in":[/^.*cardinal.*health.*$/,/^.*the.*hartford.*$/]}}
直接进入Java正则表达式。这不是错误,这是因为Java驱动程序在创建正则表达式查询时使用$ regex格式以避免任何歧义。
db.collection.find( { field: /acme.*corp/ } );
db.collection.find( { field: { $regex: 'acme.*corp' } } );
所以你的Java生成的查询:
{ "businesses" : { "$in" : [ { "$regex" : "^.*cardinal.*health.*$"},
{ "$regex" : "^.*the.*hartford.*$"}]}
}
}
完全等同于您尝试转换的查询:
{"businesses" : {"$in": [/^.*cardinal.*health.*$/,
/^.*the.*hartford.*$/]}
}
}
总之,您编写的Java已经是转换所需查询的正确方法。我在自己的测试中运行它并返回预期的结果。
也许如果你包含一些你希望通过查询返回的示例文档,我们可以进一步提供帮助吗?
答案 2 :(得分:1)
我需要列出以指定字符串开头的所有键。以下在CLI中为我工作:
db.crawlHTML.count({"_id": /^1001/})
以下是Java实现:
public List<String> listKeysLike(DB mongoDB, String likeChars) throws Exception {
DBCollection dbCollection = this.getHTMLCollection(mongoDB, TESTPROD);
List<String> keyList = new ArrayList<String>();
BasicDBObject query = new BasicDBObject();
String queryString = "^" + likeChars.trim() ; // setup regex
query.put("_id", java.util.regex.Pattern.compile(queryString));
DBCursor cursor = dbCollection.find(query);
while (cursor.hasNext()) { // _id used as the primary key
BasicDBObject obj = (BasicDBObject) cursor.next();
String tempString = obj.getString("_id");
keyList.add(tempString);
} // while
return keyList;
}
NB:&#34; TESTPROD&#34;告诉我应该使用哪两个数据库。
答案 3 :(得分:0)
您必须使用mongodb正则表达式而不是将其放在字符串中
db.somecollection.find({records: {$in: [/.*somestring.*/]}})