Mongodb获取每个子文档的最大值的文档



我有一些数据看起来像这样:

{'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日期格式,因此可以节省一些工作。

你可以在聚合管道中这样做:

  1. 使用$max查找最大日期
  2. 使用$filter来过滤Attributes数组以只包含最新的元素
  3. $unwind数组
  4. $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"
}
}
])

相关内容

  • 没有找到相关文章

最新更新