Pivot mon go данные в конвейере агрегации после $ addToSet: один набор становится ключом, один набор значений - PullRequest
0 голосов
/ 09 января 2020

Пока у меня есть конвейер, который выглядит следующим образом:

db.getCollection("Members").aggregate(
[
    { 
        "$match" : {
            "member.MemberInfo.BusinessUnitCode" : "20"
        }
    }, 
    { 
        "$group" : {
            "_id" : "$_id", 
            "items" : {
                "$addToSet" : {
                    "Type" : "$member.MemberIdentifications.MemberIdentification.IdentificationType", 
                    "Value" : "$member.MemberIdentifications.MemberIdentification.Identifier"
                }
            }
        }
    }}

И у меня есть результаты:

{ 
"_id" : ObjectId("53ad60c1600f5b241c693cbd"), 
"items" : [
    {
        "Type" : [
            "Medicaid ID", 
            "Medicare ID", 
            "Amisys ID", 
            "Social Security Number", 
            "Market Prominence ID", 
            "MBI", 
            "MPI"
        ], 
        "Value" : [
            "221075***", 
            "450807099M", 
            "C0004125301", 
            "45*******", 
            "N00020269104", 
            "3K13EA8EY99", 
            "17296217"
        ]
    }
]}

То, что я хочу, это:

{
"_id" : ObjectId("53ad60c1600f5b241c693cbd"),
{"Medicaid ID": "221075501",
 "Medicare ID": "450807099M",
 "Amisys ID": "C0004125301",
 "Social Security Number": "45*******",
 "Market Prominence ID": "N00020269104",
 "MBI": "3K13EA8EY99",
 "MPI": "17296217"
 }
}

В табличном представлении это будет выглядеть (очевидно, со многими другими записями):

_id                         Medicaid ID Medicare ID Amisys ID   Social Security Number  Market 
53ad60c1600f5b241c693cbd    221075***   450807099M  C0004125301 45*******               N00020269104

Я не уверен, какие дальнейшие шаги предпринять. Я посмотрел на похожий вопрос о повороте данных в mon go, чтобы сделать столбцы строк здесь , но это другой случай, и он действительно не относится к моему. В основном я делаю поворот из двух созданных мною наборов, поэтому один набор становится кетами, а другой - значениями одного нового документа

1 Ответ

2 голосов
/ 09 января 2020

Вы можете решить это так же, как и с for l oop. Для агрегации добавьте 3 шага.

Пояснение

  1. $unwind: "$items" создаст отдельный документ для каждого элемента.
  2. $range: [0,{$size: "$items.Type"},1] возвращает [0,1,2,3,4,5,6]
  3. Мы создаем массив с этой структурой [{ k:"Type[i]", v:"Value[i]" }]
  4. Если мы используем $arrayToObject + $replaceRoot, мы получаем желаемый результат

db.Members.aggregate([
  {
    $unwind: "$items"
  },
  {
    $project: {
      _id: 1,
      data: {
        $map: {
          input: {
            $range: [
              0,
              {
                $size: "$items.Type"
              },
              1
            ]
          },
          in: {
            k: {
              $arrayElemAt: [
                "$items.Type",
                "$$this"
              ]
            },
            v: {
              $arrayElemAt: [
                "$items.Value",
                "$$this"
              ]
            }
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: {
          $concatArrays: [
            [
              {
                k: "_id",
                v: "$_id"
              }
            ],
            "$data"
          ]
        }
      }
    }
  }
])

MongoPlayground

ПРИМЕЧАНИЕ: Вы можете получить желаемый результат с $unwind объясненным здесь

РЕДАКТИРОВАТЬ:

Попробуйте изменить:

db.Members.aggregate([
{
    "$match": {
      "member.MemberInfo.BusinessUnitCode": "20"
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "items": {
        "$push": {
          "k": "$member.MemberIdentifications.MemberIdentification.IdentificationType",
          "v": "$member.MemberIdentifications.MemberIdentification.Identifier"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: {
          $concatArrays: [
            [
              {
                k: "_id",
                v: "$_id"
              }
            ],
            "$items"
          ]
        }
      }
    }
  }
])
...