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