2016-09-23 16 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 
     } 
    } 
} 

:センサデータは毎秒保存されているが、同梱されます一緒に1時間。 'data'フィールドは、これらを分で、それぞれの分インデックスを秒でインデックスします。したがって、データの完全な時間価値は、ネストされたデータフィールドの3600エントリになります。例えば、最初の1秒間と3秒間のセンサデータを取得するために、私はオブジェクトに直接アクセスできます: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'演算子を使用してドキュメントを '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

これは良い選択肢のように見えます!試してみる。 @AbdulMaye。 –

+0

。それを聞いてうれしそれは助け..それがうまくいけば、答えに印を付けることを忘れないでください。乾杯。 – Sachin

+0

これはクエリ処理を単純化するかもしれませんが、これらのレコードを実際に更新するにはどうしたらいいですか? 'name:1'を持つオブジェクトの情報配列を追加したいとします。私は 'upsert:true'で' updateOne'を使用しています。 –

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 
    } 
] 
} 

この構造によってドキュメントの数が増える可能性があります。しかし、クエリに伴う複雑さは軽減されます。また、効率的な索引付けにより、パフォーマンスを維持することができます。 (大規模なデータの場合は、シャーディングを調べる必要があります)。

関連する問題