Mongodb получить дату из строки времени в текущем дне - PullRequest
1 голос
/ 30 апреля 2020

У меня есть коллекция, как показано ниже

//Collection design
[
  {
    "str": "09:00:00"
  }
]


// aggregate pipeline
db.collection.aggregate([
  {
    $project: {
      date: {
        $dateFromString: {
          dateString: "$str",
          format: "%H:%M:%S",
          timezone: "Asia/Kolkata"
        }
      }
    }
  }
])

//Expected Output in Indian Time

[
    {
        "_id": 1,
        "date": ISODate("2020-04-30T03:30:00.000Z")
    }
]

Ответы [ 3 ]

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

Вы можете попробовать запрос ниже, где $$ NOW вернет текущее значение даты и времени:

db.collection.aggregate([
  {
    $addFields: {
      date: {
        $dateFromParts: {
          year: { $year: "$$NOW" },
          month: { $month: "$$NOW" },
          day: { $dayOfMonth: "$$NOW" },
          hour: { $toInt: { $substrBytes: ["$str", 0, 2] } },
          minute: { $toInt: { $substrBytes: ["$str", 3, 2] } },
          second: { $toInt: { $substrBytes: ["$str", 6, 2] } },
          timezone: "Asia/Kolkata",
        }
      }
    }
  }
])

Тест: mongoplayground

Обновление:

db.collection.aggregate([
  {
    $addFields: {
      date: {
        $dateFromString: {
          dateString: {
            $concat: [
              {
                $dateToString: {
                  format: "%Y-%m-%d",
                  date: "$$NOW",
                  timezone: "Asia/Kolkata"
                }
              },
              "T",
              "$str"
            ]
          },
          timezone: "Asia/Kolkata"
        }
      }
    }
  }
])

Тест: mongoplayground

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

Вам необходимо сначала преобразовать дату в ISODate.

Вы можете $concat в формате moment, указанном ниже.

db.collection.aggregate([
  {
    $project: {
      date: {
        $dateFromString: {
          dateString: { $concat: [moment().format("YYYY-MM-DDT"), "$str"] },
          timezone: "Asia/Kolkata"
        }
      }
    }
  }
])
0 голосов
/ 30 апреля 2020

Как и вышеупомянутое решение, отправленное @ Ashh

Мне нравится другой подход к моему вопросу без использования зависимости от момента

db.collection.aggregate([
  {
    $addFields: {
      date: new Date()
    }
  },
  {
    $addFields: {
      date: {
        $dateToString: {
          date: "$date",
          format: "%Y-%m-%d",
          timezone: "Asia/Kolkata"
        }
      }
    }
  },
  {
    $addFields: {
      date: {
        $dateFromString: {
          dateString: {
            $concat: [
              "$date",
              "T",
              "$str",

            ]
          },
          timezone: "Asia/Kolkata"
        }
      }
    }
  }
])
...