根据不同字段查找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 获取与最大日期相关的标题。
我们按国家/地区代码将数据存储在 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 获取与最大日期相关的标题。