2015-11-04 107 views
0

我有一个mongo查询,如下所示。Java + Mongo + Morphia - 在mongo数组中查找正则表达式

db.Course.find({ $and: [{courseCallNo: {$in : [/^ssoapicall1$/i]} }, {clientId :123456 } ] }) 

在我的java程序中,我使用jmkgreen/morphia作为我的mongo库。我需要使用java获取精确匹配。 以下是我的代码。请帮我建立这个。谢谢。

PS:我想问题是,我正在使用一个字符串数组。我需要用正则表达式创建数组。

String courseCallNoRegex = "/^"+originalCourseCallNo+"$/i";   
    List<String> courseCallNoList = new ArrayList<String>(); 
    courseCallNoList.add(courseCallNoRegex);  
    courseCallNoList.add(courseCallNoRegex);  
    List<Course> courses= getDataStore().createQuery(Course.class).field(Constants.Course.COURSE_CALL_NO).in(courseCallNoList).field(Constants.Course.CLIENT_ID).equal(clientId).asList(); 
+0

尝试使用Java,而不是JS符号:' “^(我?)” + originalCourseCallNo + “$”; ' –

回答

1
  1. 的jmkgreen叉是真的老了。我一定会尝试进入官方的MongoDB Morphia版本,其中包括很多错误修正和新功能。

  2. 这个......会......很慢......
    除非收藏品真的很小,否则你很快就会感受到这种痛苦。如果你不能规范化数据(在其上调用中的.toLowerCase()),我会将数据复制到courseCallNoNormalized之类的数据中。所以你可以使用完全匹配,理想情况下与索引。

  3. 你试过以下吗?

    Pattern regexp = 
        Pattern.compile("^" + originalCourseCallNo + "$", Pattern.CASE_INSENSITIVE); 
    mongoDatastore.find(Course.class) 
        .field(Constants.Course.CLIENT_ID).equal(clientId) 
        .filter(Constants.Course.COURSE_CALL_NO, regexp).asList(); 
    
+0

请注意,您可能需要使用'Pattern.quote(originalCourseCallNo)'''在'originalCourseCallNo'中转义特殊符号。 – Yeti