2017-03-01 3 views
0

私はドキュメント構造を設計しており、spring-data-mongodbを使ってアクセスしています。ドキュメント構造はデバイスプロファイルを格納するためのものです。各デバイスには、異なるタイプのモジュールが含まれています。デバイスは、同じタイプの複数のモジュールを含むことができます。新しいタイプのモジュールが時々作成されるので、モジュールタイプは動的です。spring-data-mongodbドキュメントデザインオプション - 配列とダイナミックフィールド(つまりマップ)

注:定型コードを避けるためにカスタムクエリを作成しないようにしています。しかし、いくつかのカスタムクエリはうまくいくはずです。

最初の使用の動的フィールド(すなわちマップ):

私は2つのデザインで出てきます。セマンティクスはより良いですが、spring-data-mongodbを使用してクエリ/更新するのが難しいようです。

{ 
deviceId: "12345", 
instanceTypeMap: { 
    "type1": { 
     moduleMap: { 
      "1": {field1: "value",field2: "value"}, 
      "2": {field1: "value",field2: "value"} 
     } 
    }, 
    "type2": { 
     moduleMap: { 
      "30": {fielda: "value",fieldb: "value"}, 
      "45": {fielda: "value",fieldb: "value"} 
     } 
    } 
} 

第1利用アレイとクエリ/更新は、ばねデータのMongoDBとインライン以上と思われます。

{ 
deviceId: "12345", 
allInstances: [ 
    { 
     type: 1, 
     modules: [ 
      { 
       id: 1, 
       field1: "value", 
       field2: "value" 
      }, 
      { 
       id: 2, 
       field1: "value", 
       field2: "value" 
      } 
     ] 
    }, 
    { 
     type: 2, 
     modules: [ 
      { 
       id: 30, 
       fielda: "value", 
       fieldb: "value" 
      }, 
      { 
       id: 45, 
       fielda: "value", 
       fieldb: "value" 
      } 
     ] 
    } 
] 

}

Iは、配列を使用することが傾斜しています。 spring-data-mongodbでダイナミックフィールドの代わりに配列を使うほうがいいですか?私はいくつかの検索をオンラインで行い、人々は、キー(すなわちマップ内)のクエリがspring-data-mongodbでは簡単ではないと述べていることが分かりました。それは正しい陳述ですか?私は何かが欠けていますか?前もって感謝します。

答えて

0

私は以下のようなデザインになりました。私はドキュメントごとに1つのデバイスインスタンスタイプを使用します。場合によっては、 更新が同じインスタンスタイプの多くのモジュールで行われるためです。これらの更新は、1つのデータベース更新として集約できます。 冗長な「moduleId」フィールドもクエリの目的で追加されます。今

{ 
deviceId: "12345", 
instanceTypeId: "type1", 
moduleMap: { 
    "1": { 
     moduleId: "1", 
     field1: "value", 
     field2: "value" 
    }, 
    "2": { 
     moduleId: "2", 
     field1: "value", 
     field2: "value" 
    } 
} 

}

、私は春-データのMongoDBのクエリを使用することができます。

findByDeviceId("12345"); 
findByDeviceIdAndInstanceTypeId("12345","type1"); 
findByDeviceIdAndInstanceTypeIdAndModuleMapModuleId("12345","type1","1"); 
関連する問題