首页 > 解决方案 > 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
                ]
            }
        }
    }
}

标签: mongodbaggregation-framework

解决方案


如果这些日期中的任何一个不存在,您可以使用$min$ifNull运算符将最旧的日期指定为默认值:new Date()

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

推荐阅读