我正在设计一个文档结构,并使用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中查询键(即在地图中)并不那么容易。这是一个正确的说法吗?我错过什么了吗?提前谢谢你。
发布于 2017-03-18 08:08:44
我最终的设计如下所示。我对每个文档使用一种设备实例类型。因为在某些情况下,更新是在相同实例类型的多个模块上完成的。这些更新可以聚合为一个数据库更新。还添加了冗余的"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");https://stackoverflow.com/questions/42541737
复制相似问题