MongoDB Aggregation Framework группа и объединение с вложенным документом в массивах - PullRequest
0 голосов
/ 20 марта 2020

Вариант использования: у меня есть несколько документов с массивом вложенных документов (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"
        }
    }])
}

Однако этот запрос не работает ...

Что здесь не так? , Любая помощь будет оценена !!

Ответы [ 2 ]

1 голос
/ 20 марта 2020

В вашем запросе агрегации происходит много ошибок!

  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"
  }
]
0 голосов
/ 20 марта 2020

Вот мой обходной путь, основанный на ответе @ 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"}}

])
...