【发布时间】:2013-07-05 11:29:11
【问题描述】:
我有以下课程:
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 可以是任何东西)怎么办?我们如何为此创建查询?
一个选项是使用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;
}
【问题讨论】:
-
我想这可能和stackoverflow.com/questions/10901151/…是同一个问题。
-
我期待类似how-to-perform-wildcard-search-in-mongodb-using-java 中解释的解决方案。但我无法看到如何使用它来查询
keys的map..(在我的示例中,EnumChannelType被用作地图中的键) -
我的意思是您可以在 Map 值上执行此操作,但不能在 Keys 上执行此操作。我发布的链接指出您无法在 MongoDB 中查询键(即字段)名称。所以我认为你不能这样做。
-
是的,没错。还在考虑是否有其他技巧来处理这种情况。
-
是的,但是您需要更改文档的结构以使用数组,就像另一个问题的答案一样。
标签: java regex mongodb mongodb-query morphia