MongoDb: конвертировать строку даты в указанный c формат в mongodb 3.6 - PullRequest
1 голос
/ 12 апреля 2020

Мне нужно проанализировать значение даты в указанном формате c без использования поля формата в операторе dateFromString.

Пн go Детская площадка

Текущая ситуация: в Mongodb 4.0, если я форматирую dateString с использованием кода ниже, это дает мне упомянутый вывод.

 parsedDate: {
        $dateFromString: {
          dateString: "$dateS",
          format: format: "%Y-%m-%dT%H"
        }
      }
Output: "parsedDate": ISODate("2020-01-16T08:00:00Z")

Я не могу использовать поле формата в 3.6, поскольку оно не поддерживается. Как мне конвертировать мою дату в format: "%Y-%m-%dT%H" в 3.6?

Ответы [ 3 ]

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

Я думаю, что следующий запрос решит вашу проблему, потому что MongoDB 3.6 поддерживает dateFromString

Ввод:

[
  {
    "dateS": "2020-01-16T08"
  }
]

Запрос:

db.collection.aggregate([
  {
    "$project": {
      "year": {"$substr": ["$dateS",0,4]},
      "month": {"$substr": ["$dateS",5,2]},
      "day": {"$substr": ["$dateS",8,2]},
      "hour": {"$substr": ["$dateS",11,2]}
    }
  },
  {
    $addFields: {
      "isoString": {
        "$concat": ["$year","-","$month","-","$day","T","$hour",":00:00Z"]
      }
    }
  },
  {
    $addFields: {
      "newDate": {
        $dateFromString: {"dateString": "$isoString"}
      }
    }
  }
])

Выход:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "day": "16",
    "hour": "08",
    "isoString": "2020-01-16T08:00:00Z",
    "month": "01",
    "newDate": ISODate("2020-01-16T08:00:00Z"),
    "year": "2020"
  }
]
1 голос
/ 12 апреля 2020

Если я правильно понял требование, попробуйте следующий запрос, который использует: $dateFromParts

Ввод:

[
  {
    "date": ISODate("2020-01-16T08:54:17.604Z")
  }
]

Запрос:

db.collection.aggregate([
  {
    $project: {
      outputDate: {
        $dateFromParts: {
          "year": {
            $year: "$date"
          },
          "month": {
            $month: "$date"
          },
          "day": {
            $dayOfMonth: "$date"
          },
          "hour": {
            $hour: "$date"
          }
        }
      }
    }
  }
]);

O / P:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "outputDate": ISODate("2020-01-16T08:00:00Z")
  }
]

Ссылка для тестирования игровой площадки

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

Это сработало для меня: я использовал комбинированное решение от @ambienBeing и @techstack. Спасибо

Пн go Детская площадка

  "parsedDate": {
          "$dateFromParts": {
            "year": {
              "$year": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "month": {
              "$month": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "day": {
              "$dayOfMonth": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            },
            "hour": {
              "$hour": {
                $dateFromString: {
                  dateString: {
                    "$concat": [
                      "$_id.dateHour",
                      ":00:00Z"
                    ]
                  }
                }
              }
            }
          }
        },
...