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



我们有数据存储在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
}
}
]

我想根据国家获取最新日期的标题。例如:在上面的数据库中,我们有美国的最新日期为"20121-09-09",所以我想在lastReportDate中获取与此日期匹配的所有标题。对于英国来说,最晚的日期是"2021-09-08",对于新西兰来说,最晚的日期是"2021-09-06"。

我们在一份文件中有大约180个国家,我想达到DB的最小次数。那么我们可以建立一个查询,可以查询不同国家的最新日期,然后根据它查询数据库吗?

您可以尝试下面的聚合:

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" ] } } }
}
}
])

这里的挑战是您的国家是作为文档的键表示的,因此您需要从$ objecttoarray操作符开始,该操作符与$unwind一起将为您提供具有相应日期和标题的国家列表。

一旦你有了它们,你可以使用$group来获得$max date,然后使用$filter来获得与max date相关的标题。

Mongo操场

最新更新