MongoDB сумма всех размеров массива в документе - PullRequest
0 голосов
/ 14 февраля 2019

На MongoDB у меня есть такая коллекция: -

{
  org: "org",
  departments: [
    {
       name: "abc",
       employees: [
         { name: "number1" },
         { name: "number2" },
         { name: "number3" },
       ]
    },
    {
       name: "mno",
       employees: [
         { name: "number4" },
         { name: "number5" }
       ]
    },
    {
       name: "xyz",
       employees: [
         { name: "number6" },
         { name: "number7" }
       ]
    }
  ]
},{
  org: "xyz"....
}

Как найти всех сотрудников в "орг" с помощью агрегата?ожидаемый результат {org: "org", total_employees: 7}, {org: "xyz", total_employees: x}, ....

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы можете найти $size (длину) массива, выполнив цикл по массиву departments, используя $map агрегация и затем может $sum вместе все значения массива

db.collection.aggregate([
  { "$project": { 
    "total_employees": {
      "$sum": {
        "$map": { 
          "input": "$departments",
          "in": { "$size": "$$this.employees" }
        }
      }
    }
  }}
])

Выход

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "total_employees": 7
  }
]
0 голосов
/ 14 февраля 2019

Вы можете использовать $ size , чтобы получить длину внутренних массивов, и $ уменьшить , чтобы сложить эти длины:

db.collection.aggregate([
    {
        $project: {
        total_employees: {
            $reduce: {
                input: "$departments",
                initialValue: 0,
                in: { $add: [ "$$value", { $size: "$$this.employees" } ]  }
            }
        }
        }
    }
])

Mongo детская площадка

...