首页 > 解决方案 > MongoDB:只保留第一个日期

问题描述

我正在寻找使用 mongoDB 减少/过滤数组以仅获取第一个日期(如果为空则没有)的最简单和适当的解决方案。

实际上,这是我的查询:

$project {
   firstAction:{
      $reduce:{                 
                "input": { $setUnion: ["$fundraisingLog", "$missionLog", "$createdExperiencesLog", "$subscribedExperiencesLog", "$contributionLog"] }, 
                "initialValue":"01.01.2099",
                "in":{

                        $cond:[
                            {
                                $gt:[
                                    {
                                        $dateFromString:{
                                            "dateString":"$$value",
                                            "format":"%d.%m.%Y"
                                        }
                                    },
                                    {
                                        $dateFromString:{
                                            "dateString":"$$this",
                                            "format":"%d.%m.%Y"
                                        }
                                    }
                                ]
                            },
                            "$$this",
                            "$$value"
                        ]

                }
            }
        }

这几乎是完美的,期望如果数组

$setUnion: ["$fundraisingLog", "$missionLog", "$createdExperiencesLog", "$subscribedExperiencesLog", "$contributionLog"] 

是空的,我得到“01.01.2099”作为结果,而不是 null 或空结果。

标签: mongodbaggregate

解决方案


如果输入数组为空,则默认情况下$reduce将产生initialValue

如果您无法按上述查询或任何其他查询进行排序,那么我建议您尝试一下(这应该适用于空):

样本文件:

/* 1 */
{       
        "_id" : ObjectId("5d89113d5a0d22d3c8d2aad0"),
        "actionLog" : [
            "01.01.2014",
            "11.01.2014",
            "09.01.2014",
            "09.09.2014",
            "11.01.2015"
        ]
}

数据库查询:

db.yourCollection.aggregate([{ $project: { _id: 0 } }, { $unwind: '$actionLog' , preserveNullAndEmptyArrays: true },
{ $project: { actionLog: { $dateFromString: { dateString: '$actionLog', format: "%d.%m.%Y" } } } }, { $sort: { actionLog: -1 } }, { $limit: 1 }, {
    $project: {
        actionLog: { $dateToString: { format: "%d.%m.%Y", date: "$actionLog" } }
    }
}])

结果 :

/* 1 */
{
    "actionLog" : "11.01.2015"
}

推荐阅读