根据不同字段查找MongoDB个日期最新的文档

Find MongoDB document with the latest date according to different fields

我们按国家/地区代码将数据存储在 MongoDB 中。我们的文档如下所示,

[
    {
        title: '1',
        US: {
            data: { lastReportDate: '2021-09-09' } // will be fetched
        },
        GB: {
            data: { lastReportDate: '2021-09-04' }
       }
    },
    {
        title: '2',
        US: {
            data: { lastReportDate: '2021-09-07' } // will NOT be fetched
        }
    },
    {   
        title: '3',
        US: {
            data: null // will NOT be fetched
        }
    },
    {
        title: '4',
        US: {
            data: null
        }
        GB: {
            data: { lastReportDate: '2021-09-08' } // will be fetched
        },
        NZ: {
            data: { lastReportDate: '2021-09-04' }
        }
    },
    {
        title: '5',
        GB: {
            data: null
        },
        NZ: {
            data: { lastReportDate: '2021-09-06' }  // will be fetched
        }
    }
]

我想根据国家/地区获取具有最新日期的标题。 对于 EX:在上面的数据库中,美国的最新日期为“2021-09-09”,因此我想在 lastReportDate 中获取与该日期匹配的所有标题。对于英国,最晚日期是“2021-09-08”,对于新西兰,最晚日期是“2021-09-06”。

我们在一个文件中有大约 180 个国家,我想达到数据库的最小次数。那么我们是否可以构建一个查询来查询不同国家/地区的最新日期,然后据此查询数据库。

您可以尝试以下聚合:

db.collection.aggregate([
    {
        $project: {
            doc: {
                $objectToArray:"$$ROOT"
            },
            title: "$title"
        }
    },
    {
        $unwind: "$doc"
    },
    {
        $match: {
            "doc.k": { $nin: [ "_id", "title" ] }
        }
    },
    {
        $group: {
            _id: "$doc.k",
            maxDate: { $max: "$doc.v.data.lastReportDate" },
            titles: { $push: { date: "$doc.v.data.lastReportDate", title: "$title" } }
        }
    },
    {
        $project: {
            _id: 0,
            country: "$_id",
            maxTitles: { $filter: { input: "$titles", cond: { $eq: [ "$$this.date", "$maxDate" ] } } }
        }
    }
])

这里的挑战是您的国家/地区被表示为文档的键,因此您需要从 $obectToArray operator which in conjunction with $unwind 开始,将为您提供具有相应日期和标题的国家/地区列表。

获得它们后,您可以使用 $group to get $max date and then use $filter 获取与最大日期相关的标题。

Mongo Playground