首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-data-mongodb文档设计选项-数组与动态字段(即map)

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

Stack Overflow用户
提问于 2017-03-02 04:47:13
回答 1查看 105关注 0票数 0

我正在设计一个文档结构,并使用spring-data-mongodb来访问它。文档结构用于存储设备配置文件。每个设备包含不同类型的模块。该设备可以包含多个相同类型的模块。模块类型是动态的,因为有时会创建新类型的模块。

请注意:我尽量不编写自定义查询,以避免样板代码。但是,一些自定义查询应该就可以了。

我提出了两种设计:

第一个使用动态场(即map)。语义更好,但似乎更难使用spring-data-mongodb进行查询/更新。

代码语言:javascript
复制
{
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。

代码语言:javascript
复制
{
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中查询键(即在地图中)并不那么容易。这是一个正确的说法吗?我错过什么了吗?提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2017-03-18 08:08:44

我最终的设计如下所示。我对每个文档使用一种设备实例类型。因为在某些情况下,更新是在相同实例类型的多个模块上完成的。这些更新可以聚合为一个数据库更新。还添加了冗余的"moduleId“字段用于查询。

代码语言:javascript
复制
{
deviceId: "12345",
instanceTypeId: "type1",
moduleMap: {
    "1": {
        moduleId: "1",
        field1: "value",
        field2: "value"
    },
    "2": {
        moduleId: "2",
        field1: "value",
        field2: "value"
    }
}

}

现在,我可以使用spring-data-mongodb的查询:

代码语言:javascript
复制
findByDeviceId("12345");
findByDeviceIdAndInstanceTypeId("12345","type1");
findByDeviceIdAndInstanceTypeIdAndModuleMapModuleId("12345","type1","1");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42541737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档