mongodb находит самую старую дату трех ключей в каждом документе

#mongodb #aggregation-framework

#mongodb #структура агрегации

Вопрос:

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

 {
    status: String,
    estimateDate: Date,
    lostDate: Date,
    soldDate: Date,
    assignedDate: Date
}
 

С помощью этой схемы все три даты могут существовать, и ни одна из них не может существовать. Мне нужно выполнить проверку всех трех, и если хотя бы один существует, используйте самую старую дату, если ее не существует, используйте сегодняшнюю дату. С «возвращенной» датой получите разницу в днях от другого ключа (assignedDate). Я понял, как делать то, что я хочу, с одной датой, но не могу понять, как масштабировать это, чтобы включить все три ключа. Ниже приведен рабочий код, который у меня есть для одного ключа.

На этапе моего агрегированного конвейера $ project я делаю следующее:

 days: {
    $cond: {
        if: {
            $not: ["$date1"]
        },
        then: {
            $floor: {
                $divide: [
                    {
                        $subtract: [new Date(), "$assignedDate"]
                    },
                    1000 * 60 * 60 * 24
                ]
            }
        },
        else: {
            $floor: {
                $divide: [
                    {
                        $subtract: [
                            "$estimateDate",
                             "$assignedDate"
                        ]
                    },
                    1000 * 60 * 60 * 24
                ]
            }
        }
    }
}
 

Ответ №1:

Вы можете использовать операторы $ min и $ ifNull, чтобы получить самую старую дату, указанную new Date() в качестве значения по умолчанию, если какая-либо из этих дат не существует:

 db.col.aggregate([
    {
        $project: {
            oldest: {
                $min: [
                    { $ifNull: [ "$lostDate", new Date() ] },
                    { $ifNull: [ "$soldDate", new Date() ] },
                    { $ifNull: [ "$assignedDate", new Date() ] },
                ]
            }
        }
    }
])