如何使用吗啡在查询中使用正则表达式?
How to use regex inside in query using morphia?
Mongodb 允许在不使用 $regex 表达式的情况下使用模式 /pattern/ 的正则表达式。
http://docs.mongodb.org/manual/reference/operator/query/in/
我如何使用吗啡来做到这一点?
如果我使用字段运算符作为字段条件,并且类型为 "java.util.regex.Pattern" 的值,则生成的等效查询
$in:[$regex: 'given pattern'] 根本不会 return 预期结果。
期望值:$in :[ /pattern1 here/,/pattern2 here/]
实际使用 'Pattern' 对象:$in : [$regex:/pattern1 here/,$regex:/pattern 2 here/]
我不完全确定如何使用您的代码示例,但这是一个有效的 Morphia 代码片段:
Pattern regexp = Pattern.compile("^" + email + "$", Pattern.CASE_INSENSITIVE);
mongoDatastore.find(EmployeeEntity.class).filter("email", regexp).get();
请注意,这真的很慢。它不能使用索引并且总是需要全集合扫描,所以要不惜一切代价避免它!
更新:我添加了一个特定的代码示例。 $in
不需要在数组内搜索。只需像在 string:
中一样使用 /^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
单个 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"}}
]
})
不幸的是,
You cannot use $regex operator expressions inside an $in.
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);
希望有一天吗啡能支持这一点:)
Mongodb 允许在不使用 $regex 表达式的情况下使用模式 /pattern/ 的正则表达式。
http://docs.mongodb.org/manual/reference/operator/query/in/
我如何使用吗啡来做到这一点?
如果我使用字段运算符作为字段条件,并且类型为 "java.util.regex.Pattern" 的值,则生成的等效查询 $in:[$regex: 'given pattern'] 根本不会 return 预期结果。
期望值:$in :[ /pattern1 here/,/pattern2 here/] 实际使用 'Pattern' 对象:$in : [$regex:/pattern1 here/,$regex:/pattern 2 here/]
我不完全确定如何使用您的代码示例,但这是一个有效的 Morphia 代码片段:
Pattern regexp = Pattern.compile("^" + email + "$", Pattern.CASE_INSENSITIVE);
mongoDatastore.find(EmployeeEntity.class).filter("email", regexp).get();
请注意,这真的很慢。它不能使用索引并且总是需要全集合扫描,所以要不惜一切代价避免它!
更新:我添加了一个特定的代码示例。 $in
不需要在数组内搜索。只需像在 string:
/^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
单个 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"}}
]
})
不幸的是,
You cannot use $regex operator expressions inside an $in. 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);
希望有一天吗啡能支持这一点:)