5

我正在尝试用mongo+java编写$in查询。$regex它也不能在 mongo shell 中工作。我的意思是我没有得到任何结果,但也没有查询解析错误。这是我在我说的那一行从 Java Debugger 得到的最后一个查询collection.find(finalQuery)

{"$and": [ 
    {"$or": [
        {"country": "united states"}
    ]}, 
    {"businesses": {
        "$in": [
            {"$regex": "^.*cardinal.*health.*$"},
            {"$regex": "^.*the.*hartford.*$"}
        ]
    }}
]}

上述查询的 Java 代码片段:

Set<Pattern> businesses = new HashSet<Pattern>();
            
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 代码会在正则表达式周围添加双引号。

4

4 回答 4

4

您看到的行为可能是一个错误,但是作为替代方案,您可以像这样编写查询

Pattern pattern = Pattern.compile("(^aaa$)|(^bbb$)");
srchTermQuery.append("businesses", pattern);

不漂亮,但它似乎可以解决问题

于 2013-08-01T05:03:26.450 回答
3

您将无法转换:

{"businesses" : {
    "$in":[
        /^.*cardinal.*health.*$/,
        /^.*the.*hartford.*$/
    ]
}}

直接进入 Java 正则表达式。这不是错误,这是因为 Java 驱动程序$regex在创建正则表达式查询时使用格式以避免任何歧义。

$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已经是转换您想要的查询的正确方法。我已经在自己的测试中运行了它,它返回了预期的结果。

也许如果您包含一些您希望查询返回的示例文档,我们可以进一步提供帮助?

于 2013-08-11T13:03:27.537 回答
2

我需要列出以指定字符串开头的所有键。以下在 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;
}

注意:“TESTPROD”只是告诉我应该使用两个数据库中的哪一个。

于 2016-02-16T18:27:13.223 回答
0

您必须使用 mongodb 正则表达式表示法,而不是将其放入字符串中

db.somecollection.find({records: {$in: [/.*somestring.*/]}})

于 2016-02-22T20:46:55.443 回答