Как я могу $ добавить в список полей, которые могут не существовать

У меня есть документ с приведенной ниже структурой, и я хочу получить итог за последние 2 месяца, добавив 2013.5 и 2013.4, как часть процесса получения 10 лучших пакетов.

Если я использую совокупность

db.hits.aggregate(
    {$project:{"total":{"$add":["$value.2013.5", "$value.2013.4"]}}})

это вернет общее числовое значение, только если оба поля существуют в документе. Если какое-либо из полей отсутствует, итог имеет значение null. Любые идеи, как я могу ориентироваться в этом. Есть $group, $sort, $limit, следующие за $project, но я опустил их для ясности.

{
  "_id" : "4e6eef33-d88a-4d4d-a6b2-6becf1be7e8f",
  "value" : {
    "package" : 4498
    "2012" : {
      "1" : 1.0,
      "2" : 1.0,
      "4" : 1.0,
      "6" : 4.0,
      "7" : 2.0,
      "8" : 5.0,
      "12" : 1.0,
      "hits" : 15.0
    },
    "2013" : {
      "1" : 6.0,
      "4" : 2.0,
      "hits" : 8.0
    },
    "hits" : 23.0
  }
}

Кстати, два месяца я использую только для иллюстрации. Обычно я использую 12 месяцев.

Изменить: мой запасной вариант - написать функцию, которая добавляет недостающие поля в документ. Мне интересно, есть ли способ избежать этого.


person Keith Marsh    schedule 17.05.2013    source источник


Ответы (1)


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

Если одно из полей не существует, то оно обрабатывается как undefined. Значение undefined распространяется в любой операции.

Если я использую совокупность [...]

Вы можете использовать оператор $ifNull:

db.hits.aggregate({$project:{"total":{"$add":[{$ifNull: ["$value.2013.5", 0]}, {$ifNull: ["$value.2013.4", 0]}]}}})
person vinipsmaker    schedule 18.05.2013