2016-09-23 6 views
1

У меня есть коллекция, в которой каждый документ выглядит примерно так:MongoDB «» Отмотать вложенные объекты

{ 
_id: 'dev_id:datetime_hour', 
data: { 
    0: { 
     0: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     1: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     2: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     59: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     } 
    }, 
    1: { 
     0: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     1: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     2: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     }, 
     59: { 
      voltage_a: float, 
      voltage_b: float, 
      voltage_c: float, 
      current_a: float, 
      current_b: float, 
      current_c: float, 
      current_n: float, 
      active_power_a: float, 
      active_power_b: float, 
      active_power_c: float, 
      total_active_power: float 
     } 
    } 
} 

я упростил его здесь, но основная идея: данные датчика сохраняются каждый второй, но в комплекте вместе по часам. Поле «данные» индексирует их на минуту и ​​каждую минуту на вторую. Таким образом, данные в течение полного рабочего дня позволят получить 3600 записей во вложенном поле данных. Например, чтобы получить данные датчика за первую минуту и ​​третью секунду, я мог напрямую получить доступ к объекту: data.1.3.

Этот тип схемы был recommended for storing time series data by MongoDB.

Этап 1 моего агрегирования трубопровода выглядит следующим образом:

db.raw_electric.aggregate(
    [ 
    // Stage 1 
    { 
     $match: { 
     _id: { $regex: /^r10a:/ }, 
     datehour: {$gte: ISODate("2016-09-21T17:00:00"), $lte: ISODate("2016-09-21T19:00:00")} 
     } 
    } 

    ] 

); 

Можно ли «разматывания» документа - подобно тому, как вы бы размотать массив, так что я могу выставить каждый из вложенных слоев объекта?

+0

Вы не можете «размотать» документ с помощью оператора '$ unwind', он применяется только к массивам. – chridam

+0

Я знаю ... вот почему я ищу эквивалент/альтернативу для этого случая. –

ответ

2

Вы должны были создать вам схему в следующим образом:

{ 
    _id: 'dev_id:datetime_hour', 
    data: [{ 
     name: '0', 
     info: [{}] 
    }] 
} 

i.e.your данные должны быть массив objects.and из этого массива вы можете получить любой объект, используя его индекс.

{ 
    _id: 'dev_id:datetime_hour', 
    data: [{ 
      name: '0', 
      info: [{ 
       voltage_a: float, 
       voltage_b: float, 
       voltage_c: float, 
       current_a: float, 
       current_b: float, 
       current_c: float, 
       current_n: float, 
       active_power_a: float, 
       active_power_b: float, 
       active_power_c: float, 
       total_active_power: float 
      }, { 
       voltage_a: float, 
       voltage_b: float, 
       voltage_c: float, 
       current_a: float, 
       current_b: float, 
       current_c: float, 
       current_n: float, 
       active_power_a: float, 
       active_power_b: float, 
       active_power_c: float, 
       total_active_power: float 
      }, { 
       voltage_a: float, 
       voltage_b: float, 
       voltage_c: float, 
       current_a: float, 
       current_b: float, 
       current_c: float, 
       current_n: float, 
       active_power_a: float, 
       active_power_b: float, 
       active_power_c: float, 
       total_active_power: float 
      }, { 
       voltage_a: float, 
       voltage_b: float, 
       voltage_c: float, 
       current_a: float, 
       current_b: float, 
       current_c: float, 
       current_n: float, 
       active_power_a: float, 
       active_power_b: float, 
       active_power_c: float, 
       total_active_power: float 
      }], 
      { 
       name: '1', 
       info: [{ 
         voltage_a: float, 
         voltage_b: float, 
         voltage_c: float, 
         current_a: float, 
         current_b: float, 
         current_c: float, 
         current_n: float, 
         active_power_a: float, 
         active_power_b: float, 
         active_power_c: float, 
         total_active_power: float 
        }, { 
         voltage_a: float, 
         voltage_b: float, 
         voltage_c: float, 
         current_a: float, 
         current_b: float, 
         current_c: float, 
         current_n: float, 
         active_power_a: float, 
         active_power_b: float, 
         active_power_c: float, 
         total_active_power: float 
        } 
       }] 
     } 
    }] 
} 
+0

Это похоже на хорошую альтернативу! Попробуй. –

+0

@AbdulMaye. рад слышать, что это помогло .. Не забудьте отметить ответ, если он работает нормально. веселит. – Sachin

+0

Итак, похоже, это упростит процесс запроса, но как я могу по-настоящему обновить эти записи? Скажем, я хотел добавить массив info для объекта с именем: 1. Я использую 'updateOne' с' upsert: true'. –

0

Похоже, что у вас есть несколько вложенных объектов. В вашем случае, если вы рассмотрите общие массивы, которые будут отключены, чтобы получить данные за 1 час, это будет: 1 * 60 * 60 = 3600.

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

Вам нужна более плоская структура, которая может быть достигнута следующим образом: -

Создать отдельный документ для каждой минуты. Структура будет примерно такой:

{ 
_id: ObjectId(''); 
hour: 1, 
minute: 1 
seconds: [ 
    { 
    item: 0, 
    voltage_a: float, 
    voltage_b: float, 
    voltage_c: float, 
    current_a: float, 
    current_b: float, 
    current_c: float, 
    current_n: float, 
    active_power_a: float, 
    active_power_b: float, 
    active_power_c: float, 
    total_active_power: float 
    }, 
    { 
    item: 1, 
    voltage_a: float, 
    voltage_b: float, 
    voltage_c: float, 
    current_a: float, 
    current_b: float, 
    current_c: float, 
    current_n: float, 
    active_power_a: float, 
    active_power_b: float, 
    active_power_c: float, 
    total_active_power: float 
    } 
] 
}, 
{ 
_id: ObjectId(''); 
hour: 1, 
minute: 2 
seconds: [ 
    { 
    item: 0, 
    voltage_a: float, 
    voltage_b: float, 
    voltage_c: float, 
    current_a: float, 
    current_b: float, 
    current_c: float, 
    current_n: float, 
    active_power_a: float, 
    active_power_b: float, 
    active_power_c: float, 
    total_active_power: float 
    }, 
    { 
    item: 1, 
    voltage_a: float, 
    voltage_b: float, 
    voltage_c: float, 
    current_a: float, 
    current_b: float, 
    current_c: float, 
    current_n: float, 
    active_power_a: float, 
    active_power_b: float, 
    active_power_c: float, 
    total_active_power: float 
    } 
] 
} 

Эта структура может впоследствии увеличить количество документов. Но уменьшит сложность, связанную с запросами. Кроме того, при эффективном индексировании производительность может поддерживаться. (Для больших данных вы также должны заглянуть в осколки).

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