Mongodb обновить массив объектов после сортировки - PullRequest
0 голосов
/ 12 апреля 2020

Мой документ подобен показанному ниже

{
    WORKFLOWS: [
      {
        ID: 1,
        STARTEDBY: "BOBU",
        ACTIVE: true,
        HISTORY: [
          {
            STATS: 21,
            DATE_TIME: "2020-03-19T00:16:39.612Z",
            USER: "VICTORIA",
          },
          {
            STATS: 20,
            DATE_TIME: "2020-03-19T00:16:40.190Z",
            USER: "VICTORIA",
            REMINDER: [
              "2020-03-19T00:13:39.709Z",
              "2020-03-19T00:16:39.612Z",
              "2020-03-19T00:16:40.190Z",
            ],
          },
        ],
      },
    ],
  }

Я пытаюсь найти последний объект истории и создать свойство REMINDER , если оно не существует, и pu sh текущая дата-время в виде строки

Так как я собираюсь вызвать это из узла, я могу отправить текущее время из узла в качестве параметра

С уважением, Бобу

1 Ответ

0 голосов
/ 12 апреля 2020

Ну, нам нужно сделать это в два шага.

Пояснение

  1. Нам нужно найти последние DATE_TIME с $addFields.
var MAX_DT = "1970-01-01T00:00:00:00.000Z";
for(var dt in WORKFLOWS[*].HISTORY[*].DATE_TIME){
    MAX_DT = MAX_DT > dt ? MAX_DT : dt
}

На следующем шаге мы перебираем массивы WORKFLOWS и HISTORY с оператором $map и добавляем текущую дату с $$ NOW (автономно) или $$ CLUSTER_TIME (кластер). $dateToString позволяет указать timezone для настройки HH:MM результата.

Если вы хотите сохранить результат, просто добавьте в качестве последнего шага оператор $out:

{$ out: "collection"}

Примечание: Переопределит всю коллекцию с результатом агрегации.


db.collection.aggregate([
  {
    $addFields: {
      "MAX_DT": {
        $reduce: {
          input: {
            $reduce: {
              input: "$WORKFLOWS.HISTORY.DATE_TIME",
              initialValue: [],
              in: {
                $concatArrays: [ "$$value", "$$this" ]
              }
            }
          },
          initialValue: "1970-01-01T00:00:00:00.000Z",
          in: {
            $cond: [
              {
                $gt: [ "$$value", "$$this" ]
              },
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      "WORKFLOWS": {
        $map: {
          input: "$WORKFLOWS",
          as: "wf",
          in: {
            $mergeObjects: [
              "$$wf",
              {
                HISTORY: {
                  $map: {
                    input: "$$wf.HISTORY",
                    as: "his",
                    in: {
                      $cond: [
                        {
                          $eq: [ "$$his.DATE_TIME", "$MAX_DT" ]
                        },
                        {
                          $mergeObjects: [
                            "$$his",
                            {
                              REMINDER: {
                                $concatArrays: [
                                  {
                                    $ifNull: [ "$$his.REMINDER", [] ]
                                  },
                                  [
                                    {
                                      $dateToString: {
                                        date: "$$NOW",
                                        timezone: "+02:00"
                                      }
                                    }
                                  ]
                                ]
                              }
                            }
                          ]
                        },
                        "$$his"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

...