Преобразование массива MongoDB с использованием агрегации - PullRequest
0 голосов
/ 23 сентября 2019

Как разматывать несколько массивов и объединять их в один, используя агрегационные конвейеры MongoDB.

Ввод:

    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "fourWheeler" : {
        "cars" : [
            {
                "make": "Honda",
                "model": "Accord",
                "year": 2010
            },
            {
                "make": "Toyota",
                "model": "Camry",
                "year": 2012
            }
        ]
    },
    "twoWheeler" : {
        "motorBikes" : [
            {
                "make": "Suzuki",
                "model": "Hayabusa",
                "year": 2018
            },
            {
                "make": "Yamaha",
                "model": "FZ1",
                "year": 2005
            }
        ]
    }
}

Я хотел бы преобразовать вышеприведенныена следующее: * предпочтительно отсортировано по году.Как вы видите, новый ключ vehicle назначен объединенному массиву, а существующие ключи были перемещены в соответствующие элементы массива.

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "vehicles" : [
            {
                "make": "Honda",
                "model": "Accord",
                "year": 2010,
                "category": "fourWheeler"
            },
            {
                "make": "Toyota",
                "model": "Camry",
                "year": 2012,
                "category": "fourWheeler"
            },
            {
                "make": "Suzuki",
                "model": "Hayabusa",
                "year": 2018,
                "category": "twoWheeler"
            },
            {
                "make": "Yamaha",
                "model": "FZ1",
                "year": 2005,
                "category": "twoWheeler"
            }            
    ]
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Следующий запрос может дать нам ожидаемый результат:

db.collection.aggregate([
    {
        $addFields:{
            "fourWheeler.cars.category":"fourWheeler",
            "twoWheeler.motorBikes.category":"twoWheeler"   
        }
    },
    {
        $project:{
            "vehicles":{
                $concatArrays:["$fourWheeler.cars","$twoWheeler.motorBikes"]
            }
        }
    }
]).pretty()

Набор данных:

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "fourWheeler" : {
        "cars" : [
            {
                "make" : "Honda",
                "model" : "Accord",
                "year" : 2010
            },
            {
                "make" : "Toyota",
                "model" : "Camry",
                "year" : 2012
            }
        ]
    },
    "twoWheeler" : {
        "motorBikes" : [
            {
                "make" : "Suzuki",
                "model" : "Hayabusa",
                "year" : 2018
            },
            {
                "make" : "Yamaha",
                "model" : "FZ1",
                "year" : 2005
            }
        ]
    }
}

Выход:

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "vehicles" : [
        {
            "make" : "Honda",
            "model" : "Accord",
            "year" : 2010,
            "category" : "fourWheeler"
        },
        {
            "make" : "Toyota",
            "model" : "Camry",
            "year" : 2012,
            "category" : "fourWheeler"
        },
        {
            "make" : "Suzuki",
            "model" : "Hayabusa",
            "year" : 2018,
            "category" : "twoWheeler"
        },
        {
            "make" : "Yamaha",
            "model" : "FZ1",
            "year" : 2005,
            "category" : "twoWheeler"
        }
    ]
}
0 голосов
/ 23 сентября 2019

Попробуйте агрегатный конвейер как:

Примечание: этапы конвейера $ unwind, $ sort, $ group можно игнорировать, если вы не хотите сортировать по году

dbname.aggregate([
  {
    $project: {
      vehicles: {
        $concatArrays: [
          {
            $map: {
              input: "$fourWheeler.cars",
              as: "item",
              in: {
                "make": "$$item.make",
                "model": "$$item.model",
                "year": "$$item.year",
                "category": "fourWheeler"
              }
            }
          },
          {
            $map: {
              input: "$twoWheeler.motorBikes",
              as: "item",
              in: {
                "make": "$$item.make",
                "model": "$$item.model",
                "year": "$$item.year",
                "category": "twoWheeler"
              }
            }
          }
        ]
      }
    }
  },
  {
    $unwind: "$vehicles"
  },
  {
    $sort: {
      "vehicles.year": -1
    }
  },
  {
    $group: {
      _id: "$_id",
      vehicles: {
        $push: "$vehicles"
      }
    }
  }
])

Даствывод:

[
  {
    "_id": ObjectId("5d8605c9a9410a0e3ca50f12"),
    "vehicles": [
      {
        "category": "twoWheeler",
        "make": "Suzuki",
        "model": "Hayabusa",
        "year": 2018
      },
      {
        "category": "fourWheeler",
        "make": "Toyota",
        "model": "Camry",
        "year": 2012
      },
      {
        "category": "fourWheeler",
        "make": "Honda",
        "model": "Accord",
        "year": 2010
      },
      {
        "category": "twoWheeler",
        "make": "Yamaha",
        "model": "FZ1",
        "year": 2005
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...