我正在设计文档结构并使用spring-data-mongodb来访问它。文档结构用于存储设备配置文件。每个设备包含不同类型的模块。该设备可以包含多个相同类型的模块。模块类型是动态的,因为有时会创建新类型的模块。
请注意:我尽量不编写自定义查询以避免样板代码。但是,一些自定义查询应该没问题。
我提出了两个设计:
第一个使用动态字段(即map)。语义更好,但使用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"}
}
}
}
第二个使用数组和查询/更新似乎更符合spring-data-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"
}
]
}
]
}
我倾向于使用数组。使用数组而不是使用spring-data-mongodb的动态字段更好。我在线进行了一些搜索,发现人们提到在spring-data-mongodb中查询键(即在地图中)并不容易。这是正确的陈述吗?我想念什么吗?提前谢谢。
答案 0 :(得分:0)
我最终得到了如下设计。我为每个文档使用一个设备实例类型。因为,在某些情况下, 更新在同一实例类型的许多模块上完成。这些更新可以聚合为一个数据库更新。 冗余的“moduleId”字段也被添加用于查询目的。
{
deviceId: "12345",
instanceTypeId: "type1",
moduleMap: {
"1": {
moduleId: "1",
field1: "value",
field2: "value"
},
"2": {
moduleId: "2",
field1: "value",
field2: "value"
}
}
}
现在,我可以使用spring-data-mongodb的查询:
findByDeviceId("12345");
findByDeviceIdAndInstanceTypeId("12345","type1");
findByDeviceIdAndInstanceTypeIdAndModuleMapModuleId("12345","type1","1");