【问题标题】:How to map document with dynamic keys to a Spring MongoDb entity class如何将具有动态键的文档映射到 Spring MongoDb 实体类
【发布时间】:2013-07-27 19:35:55
【问题描述】:

我有一个可以有动态键名的文档:

{
"_id" : ObjectId("51a29f6413dc992c24e0283e"),
"envinfo" : {
    "appName" : "MyJavaApp",
    "environment" : {
        "cpuCount" : 12,
        "heapMaxBytes" : 5724766208,
        "osVersion" : "6.2",
        "arch" : "amd64",
        "javaVendor" : "Sun Microsystems Inc.",
        "pid" : 44996,
        "javaVersion" : "1.6.0_38",
        "heapInitialBytes" : 402507520,
}

这里envinfo 的密钥是事先不知道的。 在 Spring Data Mongodb 中创建将映射此文档的实体类的最佳方法是什么?

【问题讨论】:

  • 您是说同一集合的另一个文档将具有 _id 和一个类似于 envinfo 但称为其他内容的嵌入对象?喜欢 envinfo2?
  • 我的意思是 envinfo 上的字段是事先不知道的。在这里它们是“cpuCount”、“arch”等,但它们可能是“coreCount”或其他。

标签: java spring mongodb spring-data spring-data-mongodb


【解决方案1】:

这就是我要做的。

class EnvDocuemnt {

    @Id
    private String id; //getter and setter omitted

    @Field(value = "envinfo")
    private BasicDBObject infos;

    public Map getInfos() {
        // some documents don't have any infos, in this case return null...
        if ( null!= infos)
            return infos.toMap();
        return null;
    }

    public void setInfos(Map infos) {
        this.infos = new BasicDBObject( infos );
    }

}

这样,getInfos() 返回一个 Map<String,Object>,您可以在需要时使用 String 键进行探索,并且可以嵌套 Map。

对于你的依赖,最好不要直接暴露BasicDBObject字段,这样可以在不包含任何MongoDb库的代码中通过接口使用。

注意,如果envinfo中有一些经常访问的字段,那么最好将它们声明为你的类中的字段,有一个直接访问器,这样就不要花太多时间一遍又一遍地浏览地图.

【讨论】:

    【解决方案2】:

    这是一种方法。可能还有其他更好的方法。

    创建一个属性映射并将该映射存储在 mongo 中。

    public class Env {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private ObjectId id;
        @Field
        private Envinfo envinfo;
    
        public static class Envinfo {
           @Field
           private String appName;
           @Field
           private Map<String, String> attributes;
        }
    }
    

    如果您事先知道键,您可以将这些属性添加到 Envinfo 中,并将这些属性保留在属性映射之外。

    【讨论】:

    • 但上面不会期望像 envinfo { appName: "name, attributes {} } 这样的文档。基本上,'attributes' 需要是 envinfo 的子文档。这也没有考虑到考虑到某些键可能包含其他子文档的事实。
    • 它是 mongodb,除了 id 之外别无他求(除非您使用 spring 注释使其成为必填字段)。如果可以有其他子文档,那么使用“private Map attributes;”,但是它变得很麻烦并且完全没有模式,这不是 mongo 的用途。您应该考虑使用不同的持久性解决方案。
    • 我最终使用了类似的东西来解决我的问题how-to-aggregate-in-spring-data-mongo-db-a-nested-object-and-avoid-a-propertyException。这可能会帮助那些希望做同样事情的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2018-11-19
    • 2015-12-02
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多