MongoDB $concatenate Дата Ошибка

Я работаю над проектом агрегации Монго, чтобы группировать средние показания каждые два часа, которые возвращают желаемый результат следующим образом

{
        "_id": {
            "Year": 2016,
            "locationID": " WL 001",
            "Day": 25,
            "Hour": 12,
            "Month": 1
        },
        "temperature": 10.858749999999999,
        "pH": 0,
        "Conductivity": 2032.375
    }

Я хочу перегруппировать формат данных и объединить часть даты в поле _id, чтобы оно представляло новый формат формата данных ниже

{
    "_id": {
       "locationID": " WL 001",
    },
    "Readings": {
        "temperatue": {
            "value": 8.879
        },
        "SensoreDate": {
            "value": "2016-01-25:12"
        },
        "pH": {
            "value": 16.81
        },
        "Conductivity": {
            "value": 1084
        }
    },
}

Вот часть моего проекта по $ $

{
    "$project": {
        '_id': '$_id.locationID',
        'Readings': {
            'pH': {'value': '$pH'},
            'temperature': {'value': '$temperature'},
            'Conductivity': {'value': '$Conductivity'},
            'SensoreDate': {'value': {'$concat': ["$_id.Year", "$_id.Month", "$_id.Day", "$_id.Hour"]} }
        }
    }
}

но я получаю сообщение об ошибке $ concat поддерживает только строки, а не NumberInt32 Я пробовал несколько вариантов, но не могу заставить его работать

2 ответа

Решение

Вы можете использовать concat с substr, чтобы присоединить их к дате.

'SensoreDate': {
    'value': {
        '$concat': [{
                $substr: ["$_id.Year", 0, -1]
            },
            "-", {
                $substr: ["$_id.Month", 0, -1]
            },
            "-", {
                $substr: ["$_id.Day", 0, -1]
            },
            ":", {
                $substr: ["$_id.Hour", 0, -1]
            }
        ]
    }
 }

Преобразование int в str будет невозможно в конвейере. Так $concat не будет возможно для данного формата данных.

Другой метод, который мог бы сработать, это трюк для преобразования года, месяца, дня в BSON. Date форматировать объект

Вдохновение в том, что dateObj: {$add: [new Date(0), '$time_in_sec_epoch']},

Расчет $time_in_sec_epoch может быть сделано с помощью операторов агрегирования, таких как $sum, $divide, $subtract и т.д. Вы можете использовать формулу, приведенную в этом ответе. Это будет утомительно, но, надеюсь, вы поняли идею.

Для dateObj использовать строковую часть $dateToString

Другие вопросы по тегам