您可能想知道,Spring或Java是否是解决您问题的正确解决方案-为什么不使用更动态的工具,例如Ruby,Python或Mongoshell?
话虽这么说,让我们专注于技术问题。
如果您的目标只是存储随机数据,则基本上可以定义自己的控制器并直接使用MongoDB Java驱动程序。
如果您确实坚持为域对象类没有预定义的架构,请使用以下命令:
@document(collection = "users")public class User implements UserDetails { @Id private String id; private Map<String, Object> schemalessData; // getters/setters omitted}基本上,它为您提供了一个容器,您可以在其中放置所需的任何内容,但要注意序列化/反序列化问题(如果嵌套文档中有ObjectId和DBRef,则可能会很棘手)。另外,如果您的数据层次结构变得过于复杂,则更新数据可能会变得令人讨厌。
仍然,在某个时候,您将意识到您的数据确实具有可以精确定位并放入定义明确的POJO中的模式。
更新资料
由于人们仍然碰巧在2020年仍会阅读此文章,所以进行了最新更新:Jackson注释JsonAnyGetter和JsonAnySetter使您可以隐藏无模式数据容器的根,以便您可以将未知字段作为有效负载中的顶级字段发送。它们仍将嵌套存储在您的MongoDB文档中,但是当通过Spring请求资源时,它们将显示为顶级字段。
@document(collection = "users")public class User implements UserDetails { @Id private String id; // add all other expected fields (getters/setters omitted) private String foo; private String bar; // a container for all unexpected fields private Map<String, Object> schemalessData; @JsonAnySetter public void add(String key, Object value) { if (null == schemalessData) { schemalessData = new HashMap<>(); } schemalessData.put(key, value); } @JsonAnyGetter public Map<String, Object> get() { return schemalessData; } // getters/setters omitted}


