使用$ regex查询mongodb java $

时间:2013-08-01 03:24:03

标签: java regex mongodb

我正在尝试用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代码会在正则表达式周围添加双引号。

4 个答案:

答案 0 :(得分:3)

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

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

不漂亮,但似乎有把戏

答案 1 :(得分:2)

你无法转换:

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

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

$regex documentation表示

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.*/]}})