2015-06-30 2 views
1

Я новичок в NoSQL и morphia. Я использую Morphia для запроса MongoDB.Запрос Morphia для фильтрации и извлечения встроенного элемента списка

У меня есть коллекция образцов, как показано ниже:.

[ 
    { 
     "serviceId": "id1", 
     "serviceName": "ding", 
     "serviceVersion": "1.0", 
     "files": [ 
      { 
       "fileName": "b.html", 
       "fileContents": "contentsA" 
      }, 
      { 
       "fileName": "b.html", 
       "fileContents": "contentsB" 
      } 
     ] 
    }, 
    { 
     "serviceId": "id2", 
     "serviceName": "ding", 
     "serviceVersion": "2.0", 
     "files": [ 
      { 
       "fileName": "b.html", 
       "fileContents": "contentsA" 
      }, 
      { 
       "fileName": "b.html", 
       "fileContents": "contentsB" 
      } 
     ] 
    } 
] 

Я хотел бы принести элемент в «файлы» список, имя службы, версия службы и имя файла, используя морфий.

Я был в состоянии получить то, что я хочу с помощью запроса ниже:

db.ApiDoc.find({ serviceName: "ding", serviceVersion: "2.0"}, { files: { $elemMatch: { fileName: "b.html" } } }).sort({ "_id": 1}).skip(0).limit(30); 

То, что я пытался до сих пор:

Я попытался с помощью «elemmatch» апи, что морфий есть, но не повезло.

query = ...createQuery(
        Result.class); 
query.and(query.criteria("serviceName").equal("ding"), 
        query.criteria("serviceVersion").equal(
          "2.0")); 
query.filter("files elem",BasicDBObjectBuilder.start("fileName", "a.html").get()); 

Кажется, я получаю всю коллекцию результатов со всеми файлами. Я хотел бы получить только согласованные файлы (по имени файла).

Может кто-нибудь помочь мне, как я могу заставить это работать?

Благодаря Rajesh

+0

Возможно, вы можете добавить '.field (" files.filename "). Eq (" a.html ")' к условиям запроса, а затем использовать '.retrievedFields (" files. $. Filename "). Get () ', чтобы получить совпадение оператора позиционирования по выбору запроса вместо формы проекции' $ eleMatch'? Единственное реальное различие заключается в том, что проектная проекция «$ elemMatch» не будет возвращать пустые массивы, если условие там не было выполнено. Оператор позиционирования должен возвращать первое совпадение точно так же, но, конечно, только для документов, соответствующих условию. Не в состоянии проверить себя прямо сейчас. –

ответ

0

Я не верю, что можно получить только соответствующий вспомогательный элемент. Вы можете запросить только вернуть массив «файлы», но все элементы будут включены в результирующий набор, и вам нужно будет повторно настроить ваш код.

Другой вариант - сделать файлы собственной коллекцией с полем serviceId, и тогда у вас будет больше возможностей для загрузки только определенных файлов.

+0

Я смог сделать это с помощью запроса mongo с помощью $ elemmatch, не уверен, почему это не работает с использованием morphia, это ограничение? Я открыт для внесения изменений в структуру коллекции, сможете ли вы представить пример того, как я могу заставить это работать с изменениями? –