Суммирование значений из документа - PullRequest
1 голос
/ 19 марта 2019

В MongoDB 4 я работаю с коллекцией, которая содержит документ документов, который содержит цифры. Я хочу сложить все эти числа.

Запрос, который прямо сейчас выплевывает весь документ:

db.metadata.aggregate([  
   {  
      $match:{  
         "download-md5-checksum":"419f21233097c5f7bcd937a2c94b8032"
      }
   },
   {  
      $group:{  
         _id:"$xled.xled-bad-counts",
         count:{  
            $sum:1
         }
      }
   },
   {  
      $project:{  
         "xled.xled-bad-counts":"$_id",
         count:1,
         _id:0
      }
   }
]).pretty()

{
    "count" : 1,
    "xled" : {
        "xled-bad-counts" : {
            "left-engine-accessory-gearbox-count" : 7,
            "left-engine-accessory-gearbox-minimum" : 2,
            "left-engine-accessory-gearbox-maximum" : 2,
            "left-engine-accessory-gearbox-total" : 3
        }
    }
}

Я знаю о функции $sum, но считаю, что она хочет работать с массивом, однако мои данные организованы как документ документов.

Как я могу использовать команды оболочки MongoDB для правильного агрегирования и выполнения суммирования? Я хотел бы, чтобы мой вывод был просто

{count: 453}

1 Ответ

1 голос
/ 19 марта 2019

Вам нужен оператор $ objectToArray , чтобы агрегировать данные из "неизвестных" ключей, а затем вы можете передать это значение оператору $ sum , так как под * будет массив чисел 1005 *. $ let используется здесь для определения временной переменной, которая затем может быть передана в $sum function

db.metadata.aggregate([
    {  
        $project:{  
            _id: 0,
            count: {
                $let: {
                    vars: { xled: { $objectToArray: "$xled.xled-bad-counts" } },
                    in: { $sum: "$$xled.v" }
                }
            }
        }
    }
]).pretty()

Выход: { "count" : 453 }

...