Spring Data MongoRepository保存具有不同字段数的对象

Spring Data MongoRepository保存具有不同字段数的对象,spring,mongodb,spring-data,mongotemplate,mongorepository,Spring,Mongodb,Spring Data,Mongotemplate,Mongorepository,我将游戏状态存储在MongoDB数据库中,并使用Spring数据管理数据库交互。我不熟悉Spring数据,不确定如何处理以下情况 我有一个类型为Game的文档,其中包含一系列属性,如id、时间戳等。。。这些属性之一是用户执行的操作的列表。这些行动的形式如下: {type:2},{type:3,value:4},{type:5,id:1234},{type:6},{type:5,value:6,id:56} 换句话说,一个操作可以有三个属性:类型、值和id。但是,并不是每个操作都需要存储所有三个值

我将游戏状态存储在MongoDB数据库中,并使用Spring数据管理数据库交互。我不熟悉Spring数据,不确定如何处理以下情况

我有一个类型为Game的文档,其中包含一系列属性,如id、时间戳等。。。这些属性之一是用户执行的操作的列表。这些行动的形式如下:

{type:2},{type:3,value:4},{type:5,id:1234},{type:6},{type:5,value:6,id:56}

换句话说,一个操作可以有三个属性:类型、值和id。但是,并不是每个操作都需要存储所有三个值。我希望避免在数据库中有一堆空值,并且希望我的数据库不包括和id或未指定的值

使用Spring数据的MongoRepository模型,我不确定如何实现这一点。我可以创建一个CRUD游戏类,并让它的一个属性是一个动作列表,其中动作本身是一个CRUD类,具有属性类型、值和id,但是如果我没有指定值或id,它不会在数据库中存储空值吗


简而言之,我如何使用Spring Data的MongoRepository,但仍然能够灵活地存储具有不同参数或对象类型的对象列表。

我将通过一个示例解释如何处理不同的字段。以下Game.java POJO类表示映射到游戏集合文档的对象

public class Game {

    String name;
    List<Actions> actions;

    public Game(String name, List<Actions> actions) {
        this.name = name;
        this.actions = actions;
    }

    public String getName() {
        return name;
    }

    public List<Actions> getActions() {
        return actions;
    }

    // other get/set methods, override, etc..


    public static class Actions {

        Integer id;
        String type;

        public Actions() {
        }

        public Actions(Integer id) {
            this.id = id;
        }

        public Actions(Integer id, String type) {
            this.id = id;
            this.type = type;
        }

        public Integer getId() {
            return id;
        }

        public String getType() {
            return type;
        }

        // other methods
    }
}
这存储在数据库收集游戏中,从mongo shell查询如下:

注意actions数组。因为我们在游戏中只存储了id字段。Actions对象,所以只存储该字段。即使指定了类中的所有字段,也只保留提供了值的字段

这是游戏中的另外两个文档。使用适当的构造函数仅使用type和id+type创建的操作:

{
        "_id" : ObjectId("5eeb02fe5b86147de7dd7484"),
        "name" : "G-9",
        "actions" : [
                {
                        "type" : "type-x"
                }
        ],
        "_class" : "com.example.demo.Game"
}
{
        "_id" : ObjectId("5eeb034d70a4b6360d5398cc"),
        "name" : "G-11",
        "actions" : [
                {
                        "_id" : 2,
                        "type" : "type-y"
                }
        ],
        "_class" : "com.example.demo.Game"
}

你试过用地图吗。它可以帮助你解决问题。动作类的静态性质重要吗?或者我可以用这两个构造函数创建一个名为Action的新的非静态类吗?此外,这是否意味着在保存到db时将不包括具有空值的属性,即尚未初始化的属性?1您可以创建另一个类Actions。静态嵌套类与封闭的外部类相关联。如示例所示,数据库中不存储未赋值和默认为空值的2个字段。映射到集合文档的任何Pojo类都是如此。
{
        "_id" : ObjectId("5eeafe2043f875621d1e447b"),
        "name" : "G-1",
        "actions" : [
                {
                        "_id" : 1000
                }
        ],
        "_class" : "com.example.demo.Game"
}
{
        "_id" : ObjectId("5eeb02fe5b86147de7dd7484"),
        "name" : "G-9",
        "actions" : [
                {
                        "type" : "type-x"
                }
        ],
        "_class" : "com.example.demo.Game"
}
{
        "_id" : ObjectId("5eeb034d70a4b6360d5398cc"),
        "name" : "G-11",
        "actions" : [
                {
                        "_id" : 2,
                        "type" : "type-y"
                }
        ],
        "_class" : "com.example.demo.Game"
}