Документы заказа MongoDB на основе выражения с несколькими полями

У меня есть коллекция фильмов, в которой указано, сколько людей смотрели фильм в зависимости от их возраста. Примером может быть:

{
   name : "Return of Jedi",
   kids : 5,
   adults : 10,
   seniors : 3
}

Это означает, что «Возвращение джедая» посмотрели 5 детей, 10 взрослых и 3 пожилых человека.

Мне нужно вернуть рекомендацию фильмов на основе их рейтинга. Рейтинг рассчитывается как общее количество зрителей этого фильма, соответствующих запросу. Например. если у меня в семье дети и взрослые, ранг возвращения джедая будет 13 (#дети + #взрослые).

Может ли MongoDB сортировать по вычисляемым выражениям? Как? Если нет, то есть ли альтернатива?

Я думал решить эту проблему с помощью Aggregation Framework, добавив вычисляемое поле, а затем упорядочивая его. Но не будет ли это слишком ресурсоемким?


person checklist    schedule 24.02.2013    source источник
comment
Какой драйвер вы используете?   -  person udidu    schedule 24.02.2013
comment
Java Spring MongoDB. монгодб версии 2.2   -  person checklist    schedule 24.02.2013


Ответы (1)


Вам нужно использовать $project, затем $add.

что-то типа:

db.movies.aggregate({ $project: 
{ 
      movieName: "$name", 
      totalAudience: { $add : ["$kids","$adults","$seniors"]}
},
{ $sort : { totalAudience: -1 }}
);

предоставит вам все фильмы, упорядоченные по общему описанию аудитории.

person sambomartin    schedule 24.02.2013
comment
Спасибо. это мое первоначальное направление. Но мне любопытно, если это самый эффективный способ. Это тяжело для производительности? Есть ли способ лучше? - person checklist; 24.02.2013
comment
пока вы ограничиваете агрегацию в начале конвейера, mongodb будет использовать любые индексы, которые у вас есть в коллекции. отсортированное значение не будет проиндексировано (оно вычислено), но к тому времени у вас должны быть все документы, с которыми вы работаете. - person sambomartin; 25.02.2013
comment
альтернативным способом может быть индексированное денормализованное общее значение. но если вы имеете дело с большим количеством документов в агрегации или скорость не имеет абсолютного значения, это, вероятно, того не стоит. - person sambomartin; 25.02.2013