我有一些数据看起来像这样:
{'Type':'A',
'Attributes':[
{'Date':'2021-10-02', 'Value':5},
{'Date':'2021-09-30', 'Value':1},
{'Date':'2021-09-25', 'Value':13}
]
},
{'Type':'B',
'Attributes':[
{'Date':'2021-10-01', 'Value':36},
{'Date':'2021-09-15', 'Value':14},
{'Date':'2021-09-10', 'Value':18}
]
}
我想查询每个文档的最新日期的文档。使用上面的数据,期望的结果是:
{'Type':'A', 'Date':'2021-10-02', 'Value':5}
{'Type':'B', 'Date':'2021-10-01', 'Value':36}
我设法找到一些查询,找到所有子文档只有全局最大值。但是我没有找到每个文档的最大值。
谢谢你的帮助
将日期存储为字符串通常被认为是不好的做法。建议您将日期字段更改为日期类型。幸运的是,对于您的情况,您正在使用ISO日期格式,因此可以节省一些工作。
你可以在聚合管道中这样做:
- 使用
$max
查找最大日期 - 使用
$filter
来过滤Attributes
数组以只包含最新的元素 $unwind
数组$project
到您期望的输出
这是Mongo游乐场供您参考。
这只保留属性中的1个成员,即具有最大日期的成员。如果你想保留多个,使用@ray解决方案,保留所有具有max-date的成员。
*mongoplayground会丢失文档中字段的顺序,如果您看到错误的结果,请在您的驱动程序上测试它,这是mongoplayground工具的错误
Query1(环境保护)
此处测试代码
aggregate([
{
"$project": {
"maxDateValue": {
"$max": {
"$map": {
"input": "$Attributes",
"in": { "Date": "$$this.Date", "Value": "$$this.Value" },
}
}
},
"Type": 1
}
},
{
"$project": {
"Date": "$maxDateValue.Date",
"Value": "$maxDateValue.Value"
}
}
])
Query2 (unwind-way)
此处测试代码
aggregate([
{
"$unwind": { "path": "$Attributes" }
},
{
"$group": {
"_id": "$Type",
"maxDate": {
"$max": {
"Date": "$Attributes.Date",
"Value": "$Attributes.Value"
}
}
}
},
{
"$project": {
"_id": 0,
"Type": "$_id",
"Date": "$maxDate.Date",
"Value": "$maxDate.Value"
}
}
])