Сопоставление/Уменьшение и сортировка вложенных документов

У меня есть вопрос относительно сортировки Map/Reduce внутреннего документа в mongodb. Схема примерно следующая:

{
    "_id" : 16,
    "days" : {
      "1" : 123,
      "2" : 129,
      "3" : 140,
      "4" : 56,
      "5" : 57,
      "6" : 69,
      "7" : 80
}

Итак, теперь мой вопрос: как я могу суммировать некоторые конкретные дни из приведенных выше данных. Например:

Я хочу суммировать значения дней 1,3 и 7 и получить результат. Я попробовал решение из агрегации MapReduce на основе атрибутов, содержащихся вне документа. но безуспешно.

Кто-нибудь может мне помочь ?


person MadeOfSport    schedule 10.03.2012    source источник


Ответы (1)


MapReduce — это операция, которая перебирает кучу документов и выполняет операцию. Я не совсем уверен, что это именно то, что вы хотите, но, возможно, вы публикуете более простую форму своей реальной проблемы. В любом случае следующий код работает, выдавая 3 раза для вашего одного документа, используя _id документа в качестве ключа к функции сокращения.

doc = {_id : 16, days : { 1 : 123, 2 : 129, 3 : 140, 4 : 56, 5 : 57, 6 : 69, 7 : 80 }};
db.so.insert(doc);

map = function() {
  emit(this._id, this.days["1"]);
  emit(this._id, this.days["3"]); 
  emit(this._id, this.days["7"]); 
}

reduce = function (k, vals) {
  var sum = 0;
  vals.forEach(function (v) {sum += v;});
  return sum;
}

res = db.so.mapReduce(map, reduce, {out : {inline : 1}});
res.find();
person Leonard Garvey    schedule 10.03.2012
comment
Спасибо за Ваш ответ. Но когда я пытаюсь это сделать, я получаю ошибку компиляции. Я думаю, что Монго не нравится this.days.1 - person MadeOfSport; 10.03.2012
comment
Извините, я исправил это. Вставил неверную версию в ответ! Вероятно, причина, по которой вам было трудно найти ответ, заключается в том, что this.days.1 не работает, а this.days[1] работает. - person Leonard Garvey; 11.03.2012