2013-07-03 1 views
1

У меня есть классы следующим образом:запросов и обновления в MongoDB используя морфий хранилищу

@Entity("Collection_IAGlobals") 
public class MoDBIAGlobals { 
    @Id 
    @Indexed 
    String id; 

    @Embedded 
    Map<EnumChannelType, MoDBChannel> data = new HashMap<EnumChannelType, MoDBChannel>(); 
} 

где MoDBChannel класс:

@Entity("Collection_IAGlobals") 
@Embedded 
public class MoDBChannel extends MoDBTopic { 
    @Indexed 
    private String channelId; 

    @Embedded 
    private Map<String, MoDBTopic> data = new HashMap<String, MoDBTopic>(); 
} 

и MoDBTopic класс:

@Entity("Collection_IAGlobals") 
@Embedded 
public class MoDBTopic { 
    private String topic; 
    private Double score1 = 0.0; 
    private Double score2 = 0.0; 
} 

и MoDBIA_DAO класс:

public class MoDBIA_DAO extends BasicDAO<MoDBIAGlobals, String> { 
    public MoDBIA_DAO(Mongo mongo, Morphia morphia, String dbName) { 
     super(mongo, morphia, dbName); 
    } 
} 

У меня есть объект класса MoDBIAGlobals сохранен как:

dataStore.save(globals) 

где JSON из глобалов выглядит следующим образом:

{"id":"usr1234", 
"data":{"FACEBOOK":{"channelId":"FB1234", 
        "data":{"NO_TOPIC":{"topic":"NO_TOPIC", 
             "score1":1.0, 
             "score2":0.0}}, 
        "score1":0.0, 
        "score2":0.0}}} 

JSON of object <code>globals</code>

Теперь я хочу, чтобы запросить таким образом, чтобы получить объекты класса MoDBIAGlobals, где "id"=="usr1234" и "channelId"=="FB1234". Как я могу создать этот запрос?

Я попытался, как следует, но я не мог получить никакого результата:

MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name); 
Datastore dataStore = morphia.createDatastore(mongo, DB_Name); 
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation(); 

query.field("data.channelId").equal("FB1234"); 
query.field("data.data.topic").equal("NO_TOPIC"); 
QueryResults<MoDBIAGlobals> results = dao.find(query); 
System.out.println("results: " + results); 
System.out.println("results.count: " + results.countAll()); 

это результат печати как:

results: { "data.channelId" : "FB1234" , "data.data.topic" : "NO_TOPIC"} 
results.count: 0 

ли я делаю что-то неправильно?

+0

Вы пробовали этот запрос на Монго оболочки? Как насчет следующего запроса, он работает? '{" data.channelId ":" FB1234 "," data.data.topic.NO_TOPIC ":" NO_TOPIC "}' –

+0

Я совершенно новый для mongodb и работаю напрямую через java. У меня нет опыта работы с оболочкой mongo. –

+0

Я только что проверил и не дал никакого результата в оболочке тоже. Поэтому я предполагаю ошибку в параметрах запроса. Но какая ошибка? –

ответ

3

Я не понимаю, почему вы запрашивая data.channelId и data.data.topic, если вы хотите найти MoDBIAGlobals по id и channelId. И ваше моделирование данных тоже довольно запутанно. В любом случае, кажется, что ваш запрос не соответствует вашей структуре документа. Поля data.data.topic и data.channelId не существует. Попробуйте исправить замены с кодом ниже:

MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name); 
Datastore dataStore = morphia.createDatastore(mongo, DB_Name); 
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation(); 

query.field("data.FACEBOOK.channelId").equal("FB1234"); 
query.field("data.FACEBOOK.data.topic.NO_TOPIC").equal("NO_TOPIC"); 
QueryResults<MoDBIAGlobals> results = dao.find(query); 
System.out.println("results: " + results); 
System.out.println("results.count: " + results.countAll()); 

Теперь, если вы хотите запросить по id и channelId, попробуйте следующее:

MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name); 
Datastore dataStore = morphia.createDatastore(mongo, DB_Name); 
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation(); 

query.field("data.FACEBOOK.channelId").equal("FB1234"); 
query.field("id").equal("user1234"); 

QueryResults<MoDBIAGlobals> results = dao.find(query); 
System.out.println("results: " + results); 
System.out.println("results.count: " + results.countAll()); 
+0

Спасибо большое .. На самом деле я пытался как '' data.channelId "'/'" data (FACEBOOK) .channelId "'/'FACEBOOK.channelId' .. и т. Д. быть использованным, и это тоже с 'точками' вместо' скобки '.. Спасибо. –

+0

также дайте мне знать, как я могу запросить на карте, например. Я хочу проверить, содержит ли 'data' ключ' FACEBOOK', что-то вроде 'query.field (« data »). ContainsKey (EnumChannelType.FACEBOOK.name());' или 'query.field (" data "). containKey (EnumChannelType.FACEBOOK); '?? –

+0

Я понял, что это может быть сделано .. 'query.field (" data. "+ EnumChannelType.FACEBOOK.name()). Exists();' –