Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何根据mongo文档数组中的最大日期获取记录_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 如何根据mongo文档数组中的最大日期获取记录

Mongodb 如何根据mongo文档数组中的最大日期获取记录,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,下面是一个文档,它有一个数组名datum,我想根据group by year和type以及max date过滤记录 { "_id" : ObjectId("5fce46ca6ac9808276dfeb8c"), "year" : 2018, "datum" : [ { "Type" : "1",

下面是一个文档,它有一个数组名
datum
,我想根据group by year和type以及max date过滤记录

{
    "_id" : ObjectId("5fce46ca6ac9808276dfeb8c"),
    "year" : 2018,
    "datum" : [ 
        {
            "Type" : "1",
            "Amount" : NumberDecimal("100"),
            "Date" : ISODate("2018-05-30T00:46:12.784Z")
        }, 
        {
            "Type" : "1",
            "Amount" : NumberDecimal("300"),
            "Date" : ISODate("2023-05-30T00:46:12.784Z")
        }, 
        {
            "Type" : "2",
            "Amount" : NumberDecimal("340"),
            "Date" : ISODate("2025-05-30T00:46:12.784Z")
        }, 
        {
            "Type" : "3",
            "Amount" : NumberDecimal("300"),
            "Date" : ISODate("2021-05-30T00:46:12.784Z")
        }
    ]
}
我尝试的聚合查询

[{$group: {
  _id :"$year",
  RecentValue : 
  {
     $sum: {
        $reduce: {
          input: '$datum',
          initialValue: {},
          'in': {
            $cond: 
         [
           {
             $and:
               [ 
                 {$or:[
        { $eq:  [ "$$this.Type", '2' ] }, 
        {$eq:  [ "$$this.Type", '3' ] }
        ]}, 
        { $gt:  [ "$$this.Date", "$$value.Date" ] },

                       ] 
           }
             , 
                "$$this.Amount",      
                 0     
            ]
          }
        }
      }
  }
}}]

最大日期为“2025-05-30T00:46:12.784Z”的预期输出


请让我知道我在聚合查询中犯了什么错误。

您可以在
$group
阶段之前获取最大日期

  • $addFields
    获取具有最大日期起始的文档,在条件下用$替换或,并更正返回值
  • $组
    年度
    和金额

如何排除除$addField阶段中的金额之外的其他字段,以及您能否指出我在查询中犯了什么错误。由于您的条件和$reduce的组合,您不能以这种方式排除其他字段,它被排除在$group阶段,您的错误在
{$gt:[“$$this.Date”,“$$value.Date”]}
=>
$$this.value
这是未定义的,因为您可以看到
$cond
的then和您返回的金额或0的其他部分,因此
$$value
将是金额或0。因此,我在then and else部分中所做的是,我返回了完整对象$$this或$$valueAdd fields阶段是否会导致任何与性能相关的问题,并且它将再次运行至少100万条记录。我认为不,addFields只需筛选数组并仅获取所需对象,即可在下一个$group阶段进行处理。我不确定它是否会运行超过100万个文档,这取决于第一阶段的模式设计、索引和集合扫描、数组中的元素数量、服务器空间和集群计划等。对于查询优化,您可以参考
{
_id   :2018,
RecentValue : 340 
}
db.collection.aggregate([
  {
    $addFields: {
      datum: {
        $reduce: {
          input: "$datum",
          initialValue: {},
          "in": {
            $cond: [
              {
                $and: [
                  { $in: ["$$this.Type", ["2", "3"]] },
                  { $gt: ["$$this.Date", "$$value.Date"] }
                ]
              },
              "$$this",
              "$$value"
            ]
          }
        }
      }
    }
  },
  {
    $group: {
      _id: "$year",
      RecentValue: { $sum: "$datum.Amount" }
    }
  }
])