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 日期格式,因此可以节省一些精力。

您可以在聚合管道中执行此操作:

  1. 使用$max找出最大日期
  2. 使用$filter过滤Attributes数组只包含最新的元素
  3. $unwind数组
  4. $project 到您的预期输出

这里是Mongo playground供您参考。

这仅保留 1 个成员的属性,即具有最大日期的成员。 如果你想保留多个成员,请使用@ray 解决方案,该解决方案保留所有具有最大日期的成员。

*mongoplayground 可以丢失文档中字段的顺序, 如果你看到错误的结果,请在你的驱动程序上测试它,它是 mongoplayground 工具的错误

查询 1(本地方式)

Test code here

aggregate([
  {
    "$project": {
      "maxDateValue": {
        "$max": {
          "$map": {
            "input": "$Attributes",
            "in": { "Date": "$$this.Date", "Value": "$$this.Value" },
           }
         }
       },
      "Type": 1
     }
   },
  {
    "$project": {
      "Date": "$maxDateValue.Date", 
      "Value": "$maxDateValue.Value"
    }
  }
])

查询 2(展开方式)

Test code here

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