Проектирование нескольких документов с разными ключевыми узлами для вложенных документов - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два документа, как показано.Их общим фактором является узел в поддокументе (тип, veg_type).Я также добавил один и тот же общий узел к каждому отдельному документу (udf_type, udf_veg_type). Один - это устаревшие данные (с ключевыми узлами veggies), а другой - новые данные (с ключевыми узлами овощей).Как проецировать объединенные данные овощей и овощей (в ключевых узлах vegs) без узлов типа и veg_type?Я использую user_id для сопоставления.

Intended Output

{
  "user_id": 31,
  "veggies": [
    {
      "udf_type": "green_vegetables",
      "tot": 28560,
      "itms": [
        {
          "num": 1,
          "itm_det": {
            "name": "spinach",
            "qty": 18
          }
        }
      ],
      "chksum": "d1583afab3a04f4b32589cfa64392765n78782ff60a0e0dc24b295868083"
    },
    {
      "udf_type": "vegetables",
      "tot": 2860,
      "itms": [
        {
          "num": 1,
          "itm_det": {
            "name": "onion",
            "qty": 1
          }
        }
      ],
      "chksum": "e497c7b288e50e3be4c6bc676e4c849e4n5645n64a2d77748e185d7a1bce8c"
    },
    {
      "udf_veg_type": "green_vegetables",
      "tot": 2352000,
      "itms": [
        {
          "num": 1,
          "itm_det": {
            "name": "kale",
            "qty": 18
          }
        }
      ],
      "chksum": "87b239cd9b39baa48b4564b5754009a131f542622ba018f37cd1fdb5"
    }
  ]
}

{
  "_id" : ObjectId("1"),
  "user_id": 31,
  "veggies": [
    {
      "type": "green_vegetables",
      "desc": [
        {
          "udf_type": "green_vegetables",
          "tot": 28560,
          "itms": [
            {
              "num": 1,
              "itm_det": {
                "name": "spinach",
                "qty": 18
              }
            }
          ],
          "chksum": "d1583afab3a04f4b32589cfa64392765n78782ff60a0e0dc24b295868083"
        }
      ]
    },
    {
      "type": "vegetables",
      "desc": [
        {
          "udf_type": "vegetables",
          "tot": 2860,
          "itms": [
            {
              "num": 1,
              "itm_det": {
                "name": "onion",
                "qty": 1
              }
            }
          ],
          "chksum": "e497c7b288e50e3be4c6bc676e4c849e4n5645n64a2d77748e185d7a1bce8c"
        }
      ]
    }
  ]
}

{
  "_id" : ObjectId("2"),
  "user_id": 31,
  "vegetables": [
    {
      "veg_type": "green_vegetables",
      "desc": [
        {
          "udf_veg_type": "green_vegetables",
          "tot": 2352000,
          "itms": [
            {
              "num": 1,
              "itm_det": {
                "name": "kale",
                "qty": 18
              }
            }
          ],
          "chksum": "87b239cd9b39baa48b4564b5754009a131f542622ba018f37cd1fdb5"
        }
      ]
    }
  ]
}

1 Ответ

0 голосов
/ 14 сентября 2018

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

db.collection.aggregate([
  {
    $match: {
      "user_id": 31 // change this into the user_id variable
    }
  },
  {
    $group: {
      _id: "$user_id",
      veggies: {
        $max: "$veggies"
      },
      vegetables: {
        $max: "$vegetables"
      }
    }
  },
  {
    $project: {
      "user_id": "$_id",
      "veggies": {
        $concatArrays: [
          {
            $cond: [
              "$veggies",
              {
                $map: {
                  input: "$veggies",
                  in: {
                    $arrayElemAt: [
                      "$$this.desc",
                      0
                    ]
                  }
                }
              },
              []
            ]
          },
          {
            $cond: [
              "$vegetables",
              {
                $map: {
                  input: "$vegetables",
                  in: {
                    $arrayElemAt: [
                      "$$this.desc",
                      0
                    ]
                  }
                }
              },
              []
            ]
          }
        ]
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...