Как сгруппировать по элементу в объекте вложенного массива - PullRequest
1 голос
/ 07 мая 2019

У меня есть вложенные массивы и объекты.Я хочу отфильтровать каждое лекарство отдельно.Например, документ:

{   
    person: "X",
    treatment: [
        {
            id: 1,
            medication: [
                {
                    name: "A"
                },
                {
                    name: "B"
                }
            ]
        },
        {
            id: 2,
            medication: [
                {
                    name: "A"
                },
                {
                    name: "C"
                }
            ]
        }
    ]
},
{
    person: "Y",
    treatment: [
        {
            id: 1,
            medication: [
                {
                    name: "B"
                },
                {
                    name: "C"
                }
            ]
        }
    ]
}

Как я могу получить отдельный список лучших лекарств?Как это: A: 2, B: 2, C: 2

1 Ответ

0 голосов
/ 07 мая 2019

Вам необходимо использовать $ unwind , который выводит один документ для каждого элемента в массиве. Поскольку есть вложенные массивы, вам нужно применить $unwind дважды.

например. для коллекции с именем medicine:

db.medicine.aggregate([
  { 
    $unwind : "$treatment"
  },
  { 
    $unwind : "$treatment.medication"
  },
  {
    $group : { _id : "$treatment.medication.name", total: { $sum: 1 } }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: {
          $let: {
            vars: { data: [ { k: "$_id", v: "$total" } ] },
            in: "$$data"
          }
        }
      }
    }
  } 
])

Выходы:

{ "C" : 2 }
{ "B" : 2 }
{ "A" : 2 }

Обратите внимание, что при раскручивании вложенных массивов можно создать много документов, если имеются большие массивы, поэтому вы можете проверить этот вопрос Последствия использования $ unwind для вложенных массивов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...