2016-11-12 3 views
0

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

{ 
     "_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 Я попробовал несколько вариантов, но не могу заставить его работать

+0

Возможный дубликат [MongoDB Concat междунар и строки] (https://stackoverflow.com/questions/33891511/mongodb-concat-int-and-string) – Dane411

ответ

0

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

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

Спасибо очень много. Он работал как ожидалось – user1895915

0

Конверсии междунаров на ул невозможно будет в трубопроводе. Таким образом, $concat не будет доступен для данного формата данных.

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

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

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

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

Смежные вопросы