sql >> Base de Datos >  >> NoSQL >> MongoDB

Spring Data MongoRepository Guardar objetos con diferentes números de campos

Explicaré cómo se manejan los campos variables con un ejemplo. El siguiente Game.java La clase POJO representa la asignación de objetos al game documento de cobro.

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
    }
}

Para las Actions class necesita proporcionar a los constructores las posibles combinaciones. Usa el constructor apropiado con id , type , etc. Por ejemplo, crea un Game objeto y guardar en la base de datos:

Game.Actions actions= new Game.Actions(new Integer(1000));
Game g1 = new Game("G-1", Arrays.asList(actions));
repo.save(g1);

Esto se almacena en la colección de base de datos game de la siguiente manera (consultado de mongo cáscara):

{
        "_id" : ObjectId("5eeafe2043f875621d1e447b"),
        "name" : "G-1",
        "actions" : [
                {
                        "_id" : 1000
                }
        ],
        "_class" : "com.example.demo.Game"
}

Tenga en cuenta las actions formación. Como habíamos almacenado solo el id campo en el Game.Actions objeto, sólo se almacena ese campo. Aunque especifique todos los campos en la clase, solo se conservan aquellos proporcionados con valores.

Estos son dos documentos más con Game.Actions creado con type solo y id + type usando los constructores apropiados:

{
        "_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"
}