Как преобразовать даты в массиве с $ dateFromString? - PullRequest
2 голосов
/ 21 апреля 2019

Я пытаюсь преобразовать временные метки в массиве в даты с $ dateFromString

Пример документа, из которого я пытаюсь преобразовать даты:

{
    "_id" : ObjectId("5cbc5efc8af5053fd8bdca31"),
    "ticker" : "ticker",
    "currency" : "currency",
    "daily" : [ 
        {
            "timestamp" : "2019-04-18",
            "open" : "5.3300",
            "high" : "5.3300",
            "low" : "5.2000",
            "close" : "5.2700",
            "volume" : "6001"
        }, 
        {
            "timestamp" : "2019-04-17",
            "open" : "5.1500",
            "high" : "5.2900",
            "low" : "5.1500",
            "close" : "5.2700",
            "volume" : "37659"
        }, 
        {
            "timestamp" : "2019-04-16",
            "open" : "4.7100",
            "high" : "5.3000",
            "low" : "4.7100",
            "close" : "5.1500",
            "volume" : "112100"
        }
    ]
}

Запрос агрегации в pymongo:

db.test.aggregate([{
        '$project': {
            'daily.timestamp': {
                '$dateFromString': {
                    'dateString': '$daily.timestamp',
                    'format':  '%Y-%m-%d'
                }
            }
        }
    }])

Это выдает следующую ошибку:

pymongo.errors.OperationFailure: $ dateFromString требует, чтобы 'dateString' была строкой, найдено: массив со значением ["2019-04-18", "2019-04-17", "2019-04-16", "2019-04-15" ....]

Можно ли даже применить $ dateFromString к массиву с сотнями элементов?

1 Ответ

0 голосов
/ 11 мая 2019

Вы можете использовать оператор агрегирования $ map , чтобы применить $dateFromString к каждому элементу в массиве:

db.test.aggregate([{
  "$project": {
    "ticker": 1,
    "currency": 1,
    "daily": {
      "$map": {
        "input": "$daily",
        "in": {
          "timestamp": { 
            "$dateFromString": {
              "dateString": '$$this.timestamp',
              "format":  '%Y-%m-%d'
            }
          },
          "open": "$$this.open",
          "high": "$$this.high",
          "low": "$$this.low",
          "close": "$$this.close",
          "volume": "$$this.volume"
        }
      }
    }
  }
}])
...