如何将带有动态密钥的文档映射到Spring MongoDb实体类

我有一个可以有动态密钥名称的文档:

{ "_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中创建实体类的最佳方法是什么,它将映射此文档?

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

创建属性映射并将映射存储在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 attributes; } } 

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

这是我要做的。

 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键进行探索,并且可以嵌套Map。

对于您的依赖项,最好不要直接公开BasicDBObject字段,因此可以通过不包含任何MongoDb库的代码中的接口使用它。

请注意,如果envinfo中有一些频繁访问的字段,那么最好将它们声明为类中的字段,以便拥有直接访问者,这样就不会花费太多时间一次又一次地浏览地图。