簡體   English   中英

MongoDB 聚合框架分組並與數組中的嵌套文檔合並

[英]MongoDB Aggregation Framework group and merge with the nested document in arrays

用例:我在集合中有多個帶有嵌套文檔數組(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"
        }
    }])
}

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

這里出了什么問題。 任何幫助,將不勝感激!!

在您的聚合查詢中,很多事情都出錯了!

  1. 你為什么要為你的約會增加 5 小時?
  2. 在你的比賽階段, $lte + $gte = $eq
  3. 在您的比賽階段,狀態不存在
  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"
  }
]

這是我基於@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"}}

])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM