извлечение агрегации массива mongodb в родительский - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь получить первую дату из внутреннего массива в объекте mongodb и добавить его к своему родителю с агрегацией. Пример:

car: {
  "model": "Astra",
  "productions": [
    "modelOne": {
      "dateOfCreation": "2019-09-30T10:15:25.026+00:00",
      "dateOfEstimation": "2017-09-30T10:15:25.026+00:00",
      "someOnterInfo": "whatever"
    },
    "modelTwo": {
      "dateOfCreation": "2017-09-30T10:15:25.026+00:00",
      "dateOfEstimation": "2019-09-30T10:15:25.026+00:00",
      "someOnterInfo": "whatever"
    }
  ]
}

для превращения в

car: {
  "model": "Astra",
  "earliestDateOfEstimation": "2017-09-30T10:15:25.026+00:00",
  "earliestDateOfCreation": "2017-09-30T10:15:25.026+00:00"
}

Как этого добиться?

1 Ответ

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

Я предполагаю, что modelOne и modelTwo неизвестны, когда вы начинаете агрегацию. Ключевым шагом является запуск $ map вместе с $ objectToArray , чтобы избавиться от этих двух значений. Тогда вы можете просто использовать $ min , чтобы получить «самые ранние» значения:

db.collection.aggregate([
    {
        $addFields: {
            dates: {
                $map: {
                    input: "$car.productions",
                    in: {
                        $let: {
                            vars: { model: { $arrayElemAt: [ { $objectToArray: "$$this" }, 0 ] } },
                            in: "$$model.v"
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 1,
            "car.model": 1,
            "car.earliestDateOfEstimation": { $min: "$dates.dateOfEstimation" },
            "car.earliestDateOfCreation": { $min: "$dates.dateOfCreation" },
        }
    }
])

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

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

Первый шаг можно упростить, если всегда есть modelOne, 'modelTwo' ... (фиксированное число)

db.collection.aggregate([
    {
        $addFields: {
            dates: { $concatArrays: [ "$car.productions.modelOne", "$car.productions.modelTwo" ] }
        }
    },
    {
        $project: {
            _id: 1,
            "car.model": 1,
            "car.earliestDateOfEstimation": { $min: "$dates.dateOfEstimation" },
            "car.earliestDateOfCreation": { $min: "$dates.dateOfCreation" },
        }
    }
])

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

...