Обновление с агрегатными значениями $ dateToString не может преобразовать объект типа BSON в Date в MongoDB - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий документ в базе данных (Mongodb 4.2)

{
  "_id": ObjectId(
  "5e58dd49103bba2c961e7d80"
  ),
  "launchProducts": {
    "scheduledLaunchDate": {
      "$date": "2020-02-03T23:00:00.000Z"
    }
  }
}

Я хотел бы обновить документ и преобразовать существующий объект даты в форматированную строку (дд-мм-гггг), используя следующие функции Mon go 4.2 https://docs.mongodb.com/manual/tutorial/update-documents-with-aggregation-pipeline/

Я выполняю следующий запрос в понедельник go Оболочка:

db.collection.updateMany({}, [{"$set": {"launchProducts.scheduledLaunchDate": {"$dateToString": {"date":"$launchProducts.scheduledLaunchDate","format":"%d-%m-%Y"}}}}])

К сожалению, я получаю следующую ошибку:

2020-02-28T11:07:50.375+0100 E  QUERY    [js] WriteError({
    "index" : 0,
    "code" : 16006,
    "errmsg" : "can't convert from BSON type object to Date",
    "op" : {
        "q" : {

        },
        "u" : [
            {
                "$set" : {
                    "launchProducts.scheduledLaunchDate" : {
                        "$dateToString" : {
                            "date" : "$launchProducts.scheduledLaunchDate",
                            "format" : "%d-%m-%Y"
                        }
                    }
                }
            }
        ],
        "multi" : true,
        "upsert" : false
    }
}

Дайте мне знать, если у вас есть идеи, как это исправить.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Проблема заключалась в том, что дата неправильно сохранена в MongoDB.

Запуск db.collection.insert({"launchProducts": {"scheduledLaunchDate": ISODate("2020-02-03T23:00:00.000Z")}}) первым, решил мою проблему.

0 голосов
/ 28 февраля 2020

Вы никогда не должны хранить Date в виде строк, в будущем у вас просто возникнут проблемы. Если вы хотите получить специфицированный формат c, вам нужно отформатировать значение Date на стороне клиента при выводе.

Если вы хотите избавиться от временной части scheduledLaunchDate, вы можете использовать этот конвейер:

db.collection.aggregate([
   {
      $set: {
         "launchProducts.scheduledLaunchDate": {
            $dateFromParts: {
               year: {$year: "$launchProducts.scheduledLaunchDate"},
               month: {$month: "$launchProducts.scheduledLaunchDate"},
               day: {$dayOfMonth: "$launchProducts.scheduledLaunchDate"}               
            }
         }
      }
   }
])
...