java - 使用正则表达式创建吗啡查询

标签 java regex mongodb mongodb-query morphia

我有以下类(class):

class Document{
    Map<EnumChannelType, Channel> data;
    //some more fields
}
class Channel{
    String topic;
    //some more fields
}

enum EnumChannelType{
    BASIC_CHANNEL(1), ADVANCED_CHANNEL(2),......;
    int value;
    //constructor and some methods
}

现在我想查询Channel内的topic。如果channelType已知,我们可以轻松查询如下:

Query<Document> createQuery(EnumChannelType channelType, String topic){
    Query<Document> query = dao.createQuery().disableValidation();
    query.field("data." + channelType.name() + ".topic").equal(topic);
    return query;
}

但是如果我只想获取给定topic的查询(channelType可以是任何内容)怎么办?我们如何为此创建查询?

一个选项是使用,如下所示:

Query<Document> createQueryForTopic(String topic) {
    Query<Document> query = dao.createQuery().disableValidation();
    // add all possible Channel Types
    query.or(query.criteria("data." + EnumChannelType.BASIC_CHANNEL.name() + ".topic").equal(topic),
            query.criteria("data." + EnumChannelType.ADVANCED_CHANNEL.name() + ".topic").equal(topic),
            /*...add criteria for all possible channel types*/);
    return query;
}

但是,如果 EnumChannelType 随着时间的推移而变化,或者 EnumChannelType 具有大量成员(例如 BASIC_CHANNEL(1)、ADVANCED_CHANNEL(2),....),则这是不可行的。

我正在寻找类似的东西

Query<Document> createQuery(String topic){
    Query<Document> query = dao.createQuery().disableValidation();
    // use some regex instead of ????
    query.field("data." + ???? + ".topic").equal(topic);
    return query;
}

最佳答案

我几乎可以肯定 Morphia 和 MongoDB 不支持字段名称的正则表达式。在这种情况下,最好的选择是使用 $or 运算符。您可以遍历整个枚举以避免错误:

List<Criteria> criterias = new ArrayList<Criteria>();
for(EnumChannelType v : EnumChannelType.values()) {
    criterias.add(query.criteria("data." + v.name() + ".topic").equal(topic));
}

query.or(criterias.toArray(new Criteria[criterias.size()]);

请记住,$or 运算符并行执行查询,然后合并结果。

信息:http://docs.mongodb.org/manual/reference/operator/or/#op._S_or

关于java - 使用正则表达式创建吗啡查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487848/

相关文章:

java - 为什么我从正则表达式匹配器中得到这些结果?

node.js - GridFS + NodeJS 从 mongoDB 检索图像

java - 如何检查二维文件

python - 文本文件中的克拉 Z 符号

JavaFX - 将数据存储到相应的按钮

java - 是否可以编写正则表达式来提取 java 包?

javascript - 删除mongodb查找中的重复项

node.js - Mongodb 身份验证应用程序 - db.auth()

java - 使用多个 if 值优化数组结果

实现 Hibernate Search 时出现 Java 链接错误