如何在使用morphia的查询中使用正则表达式?

时间:2015-02-26 09:49:13

标签: regex mongodb morphia

Mongodb允许正则表达式模式/模式/而不使用$ regex表达式。

http://docs.mongodb.org/manual/reference/operator/query/in/

我如何使用吗啡呢?

如果我使用字段运算符作为字段运算符,并且类型为" java.util.regex.Pattern"然后生成等效查询 $ in:[$ regex:'给定模式']根本不会返回预期的结果。

期望:$ in:[/ pattern1 here /,/ pattern2 here /] 实际使用'模式'对象:$ in:[$ regex:/ pattern1 here /,$ regex:/ pattern 2 here /]

2 个答案:

答案 0 :(得分:5)

我不完全确定您的代码示例是什么,但这是一个有效的Morphia代码段:

Pattern regexp = Pattern.compile("^" + email + "$", Pattern.CASE_INSENSITIVE);
mongoDatastore.find(EmployeeEntity.class).filter("email", regexp).get();

请注意,这真的很慢。它不能使用索引并且总是需要完整的收集扫描,所以不惜一切代价避免它!

更新:我添加了一个特定的代码示例。在数组内部搜索不需要$in。只需像在字符串中一样使用/^I/

> db.profile.find()
{
  "_id": ObjectId("54f3ac3fa63f282f56de64bd"),
  "tags": [
    "India",
    "Australia",
    "Indonesia"
  ]
}
{
  "_id": ObjectId("54f3ac4da63f282f56de64be"),
  "tags": [
    "Island",
    "Antigua"
  ]
}
{
  "_id": ObjectId("54f3ac5ca63f282f56de64bf"),
  "tags": [
    "Spain",
    "Mexico"
  ]
}
{
  "_id": ObjectId("54f3ac6da63f282f56de64c0"),
  "tags": [
    "Israel"
  ]
}
{
  "_id": ObjectId("54f3ad17a63f282f56de64c1"),
  "tags": [
    "Germany",
    "Indonesia"
  ]
}
{
  "_id": ObjectId("54f3ad56a63f282f56de64c2"),
  "tags": [
    "ireland"
  ]
}
> db.profile.find({ tags: /^I/ })
{
  "_id": ObjectId("54f3ac3fa63f282f56de64bd"),
  "tags": [
    "India",
    "Australia",
    "Indonesia"
  ]
}
{
  "_id": ObjectId("54f3ac4da63f282f56de64be"),
  "tags": [
    "Island",
    "Antigua"
  ]
}
{
  "_id": ObjectId("54f3ac6da63f282f56de64c0"),
  "tags": [
    "Israel"
  ]
}
{
  "_id": ObjectId("54f3ad17a63f282f56de64c1"),
  "tags": [
    "Germany",
    "Indonesia"
  ]
}

注意:数组中的位置没有区别,但搜索区分大小写。如果不需要,请使用/^I/i或使用Java中的Pattern.CASE_INSENSITIVE

答案 1 :(得分:1)

单一RegEx过滤器

使用.filter().criteria().field()

query.filter("email", Pattern.compile("reg.*exp"));
// or
query.criteria("email").contains("reg.*exp");
// or
query.field("email").contains("reg.*exp");

Morphia将其转换为:

find({"email": { $regex: "reg.*exp" } })

多个RegEx过滤器

query.or(
    query.criteria("email").contains("reg.*exp"),
    query.criteria("email").contains("reg.*exp.*2"),
    query.criteria("email").contains("reg.*exp.*3")
);

Morphia将其转换为:

find({"$or" : [ 
            {"email": {"$regex": "reg.*exp"}},
            {"email": {"$regex": "reg.*exp.*2"}},
            {"email": {"$regex": "reg.*exp.*3"}}
        ]
    })

不幸的是,

  

你不能在$ in中使用$ regex运算符表达式。   MongoDB Manual 3.4

否则,我们可以这样做:

Pattern[] patterns = new Pattern[] {
    Pattern.compile("reg.*exp"),
    Pattern.compile("reg.*exp.*2"),
    Pattern.compile("reg.*exp.*3"),
};
query.field().in(patterns);

希望有一天,morphia将支持:)