2012-04-20 2 views
1

я в настоящее время имеют следующие набор данных (упрощенно):Монго Возвращаемый результат только соответствует строке массива

{ 
    'component_id':1, 
    '_locales':[ 
     { 
      'url': 'dutch', 
      'locale': 'nl_NL' 
     }, 
     { 
      'url': 'english', 
      'locale': 'en_US' 
     } 
    ] 
} (etc more rows similar to this but unique urls) 

Когда я запрос для определенного URL и локали я использую следующий запрос

db.find({'_locales': { '$elemMatch': { 'locale': 'nl_NL', 'url': 'dutch' } }}); 

я получаю однако правильный «назад», но «_locales» возвращает весь массив, включая en_US, который мне не нужен, так или иначе, он возвращает строку согласованных массивов, в этом случае:

'_locales':[ 
{ 
    'url': 'dutch', 
    'locale': 'nl_NL' 
}] 

У меня такое чувство, что я должен проходить через локали и сопоставлять строки с локали. Это не кажется правильным, есть ли лучшее решение для этого (не повторение набора результатов)? Например, изменив структуру таблицы? Я надеялся сделать это таким образом, не делая второй стол только для локалей.

ответ

4

Вы всегда запрашиваете документы верхнего уровня. Просто потому, что ваши критерии запроса включают в себя сопоставление определенного элемента массива, не указывает MongoDB, что он должен возвращать только этот элемент. В настоящее время нет способа вернуть определенные элементы массива, кроме использования оператора $ slice, который вам не нужен.

В MongoDB JIRA есть запросы функций, которые позволят вам то, что вы хотите, но в настоящее время это невозможно.

+0

Хорошо, вот что я думал. На данный момент я буду перебирать результат, поскольку в нем есть максимум 4 или 5 результатов, так что это будет проблемой производительности. Спасибо. –

Смежные вопросы