有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mongodb java$在带有$regex的查询中

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

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

用于上述查询的Java代码snipet:

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) 个答案

  1. # 1 楼答案

    您将无法转换:

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

    直接转换为Java正则表达式。这不是一个bug,因为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. # 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”只是告诉我应该使用两个数据库中的哪一个

  3. # 3 楼答案

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

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

  4. # 4 楼答案

    您看到的行为可能是一个bug,但是作为替代,您可以这样编写查询

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

    虽然不漂亮,但它似乎很管用