【问题标题】:Find MongoDB document with the latest date according to different fields根据不同字段查找最新日期的MongoDB文档
【发布时间】:2021-11-10 09:14:27
【问题描述】:

我们将数据按国家/地区代码存储在 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。
  • 不知道为什么应该为NZ返回title: '4'
  • 是的,对不起。那是一个错字。它不应该被获取,因为新西兰的最晚日期将是“2021-09-06”。

标签: mongodb mongodb-query nosql aggregation-framework aggregate


【解决方案1】:

您可以尝试以下聚合:

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 运算符开头,它与 $unwind 一起将为您提供具有相应日期和标题的国家/地区列表。

拥有它们后,您可以使用$group 获取$max 日期,然后使用$filter 获取与最大日期相关的标题。

Mongo Playground

【讨论】:

  • 感谢您的帮助。通过对该查询进行一些修改,我能够找到我正在寻找的确切解决方案。
猜你喜欢
  • 2018-10-09
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多