Mongodb 获取每个子文档都具有最大值的文档
Mongodb get document that has max value for each subdocument
我有一些数据如下所示:
{'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 playground供您参考。
这仅保留 1 个成员的属性,即具有最大日期的成员。
如果你想保留多个成员,请使用@ray 解决方案,该解决方案保留所有具有最大日期的成员。
*mongoplayground 可以丢失文档中字段的顺序,
如果你看到错误的结果,请在你的驱动程序上测试它,它是 mongoplayground 工具的错误
查询 1(本地方式)
aggregate([
{
"$project": {
"maxDateValue": {
"$max": {
"$map": {
"input": "$Attributes",
"in": { "Date": "$$this.Date", "Value": "$$this.Value" },
}
}
},
"Type": 1
}
},
{
"$project": {
"Date": "$maxDateValue.Date",
"Value": "$maxDateValue.Value"
}
}
])
查询 2(展开方式)
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"
}
}
])
我有一些数据如下所示:
{'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 playground供您参考。
这仅保留 1 个成员的属性,即具有最大日期的成员。 如果你想保留多个成员,请使用@ray 解决方案,该解决方案保留所有具有最大日期的成员。
*mongoplayground 可以丢失文档中字段的顺序, 如果你看到错误的结果,请在你的驱动程序上测试它,它是 mongoplayground 工具的错误
查询 1(本地方式)
aggregate([
{
"$project": {
"maxDateValue": {
"$max": {
"$map": {
"input": "$Attributes",
"in": { "Date": "$$this.Date", "Value": "$$this.Value" },
}
}
},
"Type": 1
}
},
{
"$project": {
"Date": "$maxDateValue.Date",
"Value": "$maxDateValue.Value"
}
}
])
查询 2(展开方式)
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"
}
}
])