Запрос структуры вложенного документа в mongoDb - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь выполнить запрос ниже структуры документа

{
 _id: '7ja9sjkadja',
 parent: {
     parentName: 'Super',
     firstGenerations: [
         {
            name: 'First Generation',
            secondGenerations: [
            {
                 name: 'Second Generation 1',
                 value: 'Married'
            },

            {
                 name: 'Second Generation 2',
                 value: 'Single'
            },
            {
                 name: 'Second Generation 3',
                 value: 'Single'
            }

           ]
         }


     ]
 }

}

Ожидаемый результат:

{
  firstGenerationName: 'First Generation',
  totalCount: 3
  values: [
     {
        categoryName: 'Married (1)',
        count: 1,
        firstGenerationName: 'First Generation'
     },

     {
        categoryName: 'Single (2)',
        count: 2,
        firstGenerationName: 'First Generation'
     }

    ]

  }

Запрос, проверенный мной:

db.generations.aggregrate ([

{ $project: { 'firstGenerations': '$parent.firstGenerations'} },
{ $unwind: '$firstGenerations'},
{ $unwind: '$firstGenerations.secondGenerations'}
{
   $group: {
      _id: '$_id',
      count: { 'sum': '$secondGenerations.value' },
      firstGenerationName: { $first: '$firstGenerations.name'} 
   }
}

])

Я могу правильно размотаться, но не могу объединить функциональность группы, взяв одно значение из родительского массива и сосчитав из второго массива.

Любая помощь будет оценена

1 Ответ

1 голос
/ 22 января 2020

Обычно вам нужно запустить $group дважды, чтобы сначала получить внутренний счет:

db.collection.aggregate([
    {
        $unwind: "$parent"
    },
    {
        $unwind: "$parent.firstGenerations"
    },
    {
        $unwind: "$parent.firstGenerations.secondGenerations"
    },
    {
        $group: {
            _id: {
                fgName: "$parent.firstGenerations.name",
                sgValue: "$parent.firstGenerations.secondGenerations.value"
            },
            count: { $sum: 1 }
        }
    },
    {
        $group: {
            _id: "$_id.fgName",
            values: {
                $push: {
                    categoryName: { $concat: [ "$_id.sgValue", " (", { $toString: "$count" }, ")" ] },
                    count: "$count",
                    firstGenerationName: "$_id.fgName"
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            firstGenerationName: "$_id",
            values: 1,
            totalCount: { $sum: "$values.count" }
        }
    }
])

Пн go Детская площадка

...