spring-data-mongodb文档设计选项 - 数组与动态字段(即地图)

时间:2017-03-01 20:47:13

标签: mongodb spring-data-mongodb

我正在设计文档结构并使用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中查询键(即在地图中)并不容易。这是正确的陈述吗?我想念什么吗?提前谢谢。

1 个答案:

答案 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");