2

Добрый день. Необходимо найти всех людей которые окончили, например, институт 567. Проблема в том, что мы не можем точно указать родительские элементы для этого института(и находятся на разных уровнях). Например и в professions.actor.theatre.drama и в professions.actor.stuntman есть institute

 {
   "_id": ObjectId("56ff619b14989a0ed0316921"),
   "firstName": "Иван",
   "lastName": "Лабанов",
   "professions": {
     "actor": {
       "film": {
         "drama": {
           "institute": 567
         },
       },
       "theatre": {
         "drama": {
           "institute": 123,
         },
       },
       "stuntman": {
         "institute": 321,
       }
     },
   }
 }, {
   "_id": ObjectId("56fe77b114989a05577e9f22"),
   "firstName": "Петр",
   "lastName": "Смирнов",
   "professions": {
     "actor": {
       "film": {
         "comedy": {
           "institute": 567,
         }
       },
     }
   }
 }, {
   "_id": ObjectId("56fe77b114989a05577e9f11"),
   "firstName": "Василий",
   "lastName": "Иванов",
   "professions": {
     "actor": {
       "film": {
         "comedy": {
           "institute": 123,
         }
       },
     }
   }
 }

Выбрали не реляционную именно потому, что у нас данные хоть и структурируются, но они имеют вложенность, с которой прекрасно справляется монга. Суть задачи - у нас множество людей творческих профессий(и еже с ними): Актёры, Озвучка, Модели, Мейкаперы. У каждой из этих профессий есть множество направлений (актёр театра, актёр кино, цирковые актёры, каскадеры), у этих направлений могут быть конкретные специализации (театр оперы и балета, актёр комедийного кино и тд), и так еще несколько уровней вложенности(образование, знание языков и тд). Сложность не просто в хранении, а в том, чтобы можно было искать по этим параметрам. Вот реальный пример запроса:

Мужчина, выше 180см, до 25 лет, водительские права категории С, окончивший ВГИК, солист оперы(итальянский язык), умеющий жонглировать.

  • Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). – Nicolas Chabanovsky Apr 09 '16 at 07:25

1 Answers1

1

Если честно, то структура у вас немного не логиная и неудобная. Лучше конечно подумать и переделать под конкретные ваши задачи и параметры поиска. Например добавить ключ institute в каком-то фиксированном месте, и добавлять туда данные как в массив. Будет дублирование информации и проблемы с поддержанием ее целостности, но не будет проблем с поиском.

А на существующей структуре, я думаю, можно попробовать использовать mapreduce: в функции map проходить по документу на любой уровень вложенности и искать нужный ключ с соответствующим значением. И принимать решение о том подходит вам этот документ или нет.

newman
  • 3,599
  • Благодарю за ответ. Да, скорее всего будем хранить подобные институту данные в фиксированном месте. – iceman12 Apr 08 '16 at 08:48