mongodb 数组聚合提取到父级

mongodb array aggregation extract to parent

我正在尝试从 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"
}

我怎样才能做到这一点?

我假设 modelOnemodelTwo 在您开始聚合时是未知的。关键一步是运行 $map along with $objectToArray in order to get rid of those two values. Then you can just use $min得到"earliest"值:

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" },
        }
    }
])

Mongo Playground

编辑:

如果总有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" },
        }
    }
])

Mongo Playground (2)