Создание запроса morphia с регулярным выражением

У меня есть следующие классы:

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
}

Теперь я хочу запросить topic внутри Channel. Если 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 может быть любым)? Как мы можем создать запрос для этого?

Один из вариантов использует or следующим образом:

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;
}

person N D Thokare    schedule 05.07.2013    source источник
comment
Я думаю, что это может быть тот же вопрос, что и stackoverflow.com/ вопросы/10901151/.   -  person Trisha    schedule 05.07.2013
comment
Я ожидаю решения, похожего на объяснение в how-to-perform -wildcard-search-in-mongodb-using-java . Но я не могу понять, как использовать его для запроса keys из map.. (посмотрите в моем примере, EnumChannelType используются в качестве ключа на карте)   -  person N D Thokare    schedule 05.07.2013
comment
Я хочу сказать, что вы можете сделать это со значениями карты, но не с ключами. Ссылка, которую я разместил, указывает на то, что вы не можете запрашивать имена ключей (т.е. полей) в MongoDB. Так что я не думаю, что вы можете сделать это.   -  person Trisha    schedule 05.07.2013
comment
да, верно. Все еще думаю, есть ли еще один трюк, чтобы справиться с этой ситуацией.   -  person N D Thokare    schedule 05.07.2013
comment
Да, есть, но вам нужно будет изменить структуру вашего документа, чтобы вместо этого использовать массивы, как в ответе на другой вопрос.   -  person Trisha    schedule 05.07.2013


Ответы (1)


Я почти уверен, что 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

person Miguel Cartagena    schedule 05.07.2013