Среднее с условием where в массиве в mon go по всем коллекциям - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно найти средний возраст для прихода 2 в документе mon go.

  {
            "_id" : ObjectId("57113238bde91693e9ff69e7"),
            "docname" : "Arthur Hovsepyan",
            "job_desc" : "Hepatologist",
            "sex" : "male",
            "jobtype" : "fulltime",
            "office" : "room 448",
            "email" : "arturchik@hotmail.com",
            "phone_number" : 862124343,
            "address" : "68 Peterburg street,waterford",
            "hours" : 12,
            "patients" : [
                    {
                            "name" : "Jenny Power",
                            "ward_no" : 1,
                            "sex" : "female",
                            "termdays" : 2,
                            "illness_type" : "minor",
                            "age" : 22,
                            "phone_number" : 877285221,
                            "address" : "63 Johnston street ,Waterford"
                    },
                    {
                            "name" : "Marie Peters",
                            "ward_no" : 2,
                            "sex" : "female",
                            "termdays" : 0,
                            "illness_type" : "minor",
                            "age" : 21,
                            "phone_number" : 862145992,
                            "address" : "99 Grange,Waterford"
                    },
                    {
                            "name" : "Philip John",
                            "ward_no" : 2,
                            "sex" : "male",
                            "termdays" : 10,
                            "illness_type" : "serious",
                            "age" : 31,
                            "phone_number" : 861125981,
                            "address" : "12 Monvoy Bridge,Waterford"
                    },
                    {
                            "name" : "Marta Peters",
                            "ward_no" : 3,
                            "sex" : "female",
                            "termd7ays" : 0,
                            "illness_type" : "minor",
                            "age" : 31,
                            "phone_number" : 862125981,
                            "address" : "100 Grange Manor,Waterford"
                    }
            ]
    }

Мне нужно найти средний возраст для прихода № 2. Я пытаюсь вычислить средний показатель агрегации. операция над всеми значениями массива для каждого документа в моей коллекции, где номер палаты = 2.

1 Ответ

0 голосов
/ 18 апреля 2020

Нам нужно применить оператор $ filter для фильтрации только ward_no = 2 и с $ let возвращает age array, отфильтрованный от предыдущего шага, и оператора $ avg возвращает ожидаемый результат.

Попробуйте это:

db.collection.aggregate([
  {
    $addFields: {
      avg: {
        $avg: {
          $let: {
            vars: {
              input: {
                $filter: {
                  input: "$patients",
                  cond: { $eq: [ "$$this.ward_no", 2 ] }
                }
              }
            },
            in: "$$input.age"
          }
        }
      }
    }
  }
])

MongoPlayground | Все документы среднего возраста

Примечание: Замените $addFields на $project, если хотите вернуть только средний результат.

...