【问题标题】:MongoDB Aggregation Framework group and merge with the nested document in arraysMongoDB Aggregation Framework 分组并与数组中的嵌套文档合并
【发布时间】:2020-07-01 06:46:32
【问题描述】:

用例:我在集合中有多个带有嵌套文档数组(PODDetails)的文档,需要一个结果分组(WTID 字段)并将一个数组(PODDetails)合并为单个文档(除了 PODDetails 其他详细信息相同)。

以下是集合中的文档:

    {
        "_id": "180910eb-4670-4ccb-ac89-0e993b050105",
        "WTID": "WT1389",
        "TDLNumber": "002",
        "POD": "SW 35-44-07-W5",
        "PODDetails": [
            {
                "LoadStartDate": "2019-10-18",
                "LoadStartTime": "17:37:54",
                "LoadStopDate": "2019-10-18",
                "LoadStopTime": "17:37:54",
                "Volume": 15,
                "VolUnit": "m3"
            }
        ],
        "Status": "Active",
        "createdon": {
            "$date": "2020-03-20T17:37:54.000Z"
        }
    },
    {
        "_id": "5a4d3ee0-83e3-40df-a3a3-28f8c7560106",
        "WTID": "WT1389",
        "TDLNumber": "002",
        "POD": "SW 35-44-07-W5",
        "PODDetails": [
            {
                "LoadStartDate": "2019-10-18",
                "LoadStartTime": "17:38:33",
                "LoadStopDate": "2019-10-18",
                "LoadStopTime": "17:38:33",
                "Volume": 25,
                "VolUnit": "m3"
            }
        ],
        "Status": "Active",
        "createdon": {
            "$date": "2020-03-20T18:55:15.000Z"
        }
    },
    {
        "_id": "180910eb-4670-4ccb-ac89-0e993b050107",
        "WTID": "WT1390",
        "TDLNumber": "002",
        "POD": "SW 35-44-07-W5",
        "PODDetails": [
            {
                "LoadStartDate": "2019-10-18",
                "LoadStartTime": "17:37:54",
                "LoadStopDate": "2019-10-18",
                "LoadStopTime": "17:37:54",
                "Volume": 15,
                "VolUnit": "m3"
            }
        ],
        "Status": "Active",
        "createdon": {
            "$date": "2020-03-20T17:37:54.000Z"
        }
    }

结果应如下所示,基于“WTID”字段

{
    "_id": "180910eb-4670-4ccb-ac89-0e993b050105",
    "WTID": "WT1389",
    "TDLNumber": "002",
    "POD": "SW 35-44-07-W5",
    "PODDetails": [
        {
            "LoadStartDate": "2019-10-18",
            "LoadStartTime": "17:37:54",
            "LoadStopDate": "2019-10-18",
            "LoadStopTime": "17:37:54",
            "Volume": 15,
            "VolUnit": "m3"
        },
        {
            "LoadStartDate": "2019-10-18",
            "LoadStartTime": "17:38:33",
            "LoadStopDate": "2019-10-18",
            "LoadStopTime": "17:38:33",
            "Volume": 25,
            "VolUnit": "m3"
        }
    ],
    "createdon": {
        "$date": "2020-03-20T17:37:54.000Z"
    }
},
{
    "_id": "180910eb-4670-4ccb-ac89-0e993b050107",
    "WTID": "WT1390",
    "TDLNumber": "002",
    "POD": "SW 35-44-07-W5",
    "PODDetails": [
        {
            "LoadStartDate": "2019-10-18",
            "LoadStartTime": "17:37:54",
            "LoadStopDate": "2019-10-18",
            "LoadStopTime": "17:37:54",
            "Volume": 15,
            "VolUnit": "m3"
        }
    ],
    "createdon": {
        "$date": "2020-03-20T17:37:54.000Z"
    }
}

以下是我尝试过的'...我只需要获取当前日期(即今天)的文档

{
    aggregate([{
        "$addFields": {
            "CreatedOnDate": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": {
                        "$add": ["$createdon", 18000000]
                    }
                }
            }
        }
    }, {
        "$match": {
            "CreatedOnDate": {
                "$gte": "2020-03-20",
                "$lte": "2020-03-20"
            },
            "Status": {
                "$eq": "Active"
            }
        }
    }, {
        "$unwind": "$PODDetails"
    }, {
        "$group": {
            "WaterTrackingID": "$WaterTrackingID",
            "POD": {
                "$addToSet": "$PODDetails"
            },
            "data": {
                "$first": "$$ROOT"
            }
        }
    }, {
        "$project": {
            "TDLNumber": "$data.TDLNumber",
            "PointOfDiversion": "$data.PointOfDiversion",
            "POD": 1,
            "CreatedOnDate": "$data.CreatedOnDate"
        }
    }])
}

但是,此查询不起作用...

这里出了什么问题。任何帮助将不胜感激!

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您的聚合查询中有很多地方出错了!

    1. 为什么要在约会中增加 5 小时?
    2. 在你的比赛阶段,$lte + $gte = $eq
    3. 在您的比赛阶段,Status 不存在
    4. 在您的 $unwind 阶段,PointOfDiversionVolumeDetails 不存在。
    5. 您的 $group 阶段没有提供任何 _id 或累加器(数据除外),WaterTrackingID 不存在。 ...

    这是一个似乎可以实现您想要的查询:

    db.collection.aggregate([
      {
        $match: {
          $expr: {
            $eq: [
              {
                $dateToString: {
                  date: "$createdon",
                  format: "%Y-%m-%d"
                }
              },
              "2020-03-20"
            ]
          },
    
        }
      },
      {
        $group: {
          _id: "$WTID",
          POD: {
            $first: "$POD"
          },
          PODDetails: {
            $push: 
              {
                $arrayElemAt: [
                "$PODDetails",
                0
                ]
              }
          },
          TDLNumber: {
            $first: "$TDLNumber"
          },
          createdon: {
            $first: {
              $dateToString: {
                date: "$createdon",
                format: "%Y-%m-%d"
              }
            },
    
          },
    
        }
      }
    ])
    

    会输出

    [
      {
        "POD": "SW 35-44-07-W5",
        "PODDetails": [
    
            {
              "LoadStartDate": "2019-10-18",
              "LoadStartTime": "17:37:54",
              "LoadStopDate": "2019-10-18",
              "LoadStopTime": "17:37:54",
              "VolUnit": "m3",
              "Volume": 15
            }
          ,
    
            {
              "LoadStartDate": "2019-10-18",
              "LoadStartTime": "17:38:33",
              "LoadStopDate": "2019-10-18",
              "LoadStopTime": "17:38:33",
              "VolUnit": "m3",
              "Volume": 25
            }
    
        ],
        "TDLNumber": "002",
        "_id": "WT1389",
        "createdon": "2020-03-20"
      },
      {
        "POD": "SW 35-44-07-W5",
        "PODDetails": [
    
            {
              "LoadStartDate": "2019-10-18",
              "LoadStartTime": "17:37:54",
              "LoadStopDate": "2019-10-18",
              "LoadStopTime": "17:37:54",
              "VolUnit": "m3",
              "Volume": 15
            }
    
        ],
        "TDLNumber": "002",
        "_id": "WT1390",
        "createdon": "2020-03-20"
      }
    ]
    

    【讨论】:

    • 请查看已编辑的问题,1. 不需要添加 5 小时,但它添加了时区。 2. $lte + $gte = 投注 2 个日期的文件。添加了 3 和 4 个缺失字段。 5. 对了,蓄能器不见了。
    • 是的,现在看起来很酷,而不是两次展开使用。谢谢!!点赞!!
    【解决方案2】:

    这是我基于@matthPen 的回答的解决方法

    db.collection.aggregate(
    [
        {$match:{Status:"Active"}},
        {$match: {
          $expr: {
            $eq: [
              {
                $dateToString: {
                  date: "$createdon",
                  format: "%Y-%m-%d"
                }
              },
              "2020-03-20"
            ]
          },
        }},
        {$group : {_id : "$WTID", PODDetails : {$push : "$PODDetails"},
            TDLNumber: {$first: "$TDLNumber"}, POD: {$first: "$POD"}        
        }},
        {$unwind : "$PODDetails"}, 
        {$unwind : "$PODDetails"}, 
        {$group : { _id : "$_id", PODDetails : {$addToSet : "$PODDetails"},
            TDLNumber: {$first: "$TDLNumber"}, POD: {$first: "$POD"}
        }},
        {$project:{WaterTrackingID:"$_id", TDLNumber:"$TDLNumber", POD:"$POD", PODDetails:"$PODDetails"}}
    
    ])
    

    【讨论】:

    • 您的查询无法正常工作!您在第一个小组赛阶段使用的 WaterTrackingID 不存在。两次放松不是一个好的解决方案,我会在第一个小组赛阶段后更新我的答案以获得一组对象,所以放松阶段和接下来的小组赛阶段都无关紧要
    • 是的,我用“WaterTrackingID”代替了“WTID”。改变的解决方案。您的解决方案将结果作为数组对象的对象返回,所以我曾经展开两次。
    • 看看修改后的答案,我解决了这个问题
    猜你喜欢
    • 2020-01-13
    • 2020-11-17
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多