Busquedas @Embedded

Documentos Embebidos

El método T find() devolverá todas las clases definidas con los valores correspondientes.

De manera automática cargara en el Entity que esta embebido los datos del documento embebido en el correspondiente documento que esta almacenado en MongoDB.

Al realizar una consulta normal en un documento cargara todos los entitys dentro de el. (Pueden ser simples objetos utilizando la anotación @Embedded o listas de entitys).

Importante:

Para hacer búsquedas por documentos embebidos debemos indicar la opción de búsqueda con el con formato colección.atributo, como se muestra en el ejemplo 2.

Continentes

{ "_id" : ObjectId("587ee8fdb2a08a17e1782629"),

    "idcontinente" : "am",

    "continente" : "America",

    "planetas" : {

            "idplaneta" : "tr",

            "planeta" : "Tierra",

            "fecha" : ISODate("2017-01-18T04:03:08.872Z")

    }
}

Ejemplo 1 Búsqueda por cualquier atributo del entity:

public class Continentes {

@Id

private String idcontinente;

private String continente;

@Embedded

private Planetas planetas;



@Override

public String toString() {

    return "Continentes{" + "idcontinente=" + idcontinente + ", continente=" + continente + ", planetas=" + planetas + '}';

}

Controller

     Continentes continentes = new Continentes();
        Optional<Continentes> c = continentesFacade.find("idcontinente", "am");

        if(!c.isPresent()){
            System.out.println("No hay un continente con ese codigo");
        }else
        {
            continentes = c.get();
            System.out.println(""+continentes.toString());
            System.out.println("Planeta: " +continentes.getPlanetas().getPlaneta());
        }

Salida:

Continentes{idcontinente=am, continente=America, planetas=Planetas{idplaneta=tr, planeta=Tierra, fecha=Tue Jan 17 23:10:49 EST 2017}}

Planeta: Tierra

Ejemplo 2 Buscar por un atributo del documento embebido

En este caso queremos buscar el documento que tiene asignado el planeta marte.

Debemos especificar el documento de busqueda: new Document("planetas.idplaneta","marte")

Documento:

{

"_id" : ObjectId("5884e4ffb2a08a10f017f673"),

"idcontinente" : "as",

"continente" : "Asia",

"planetas" : {

"idplaneta" : "marte",

"planeta" : "Marte",

"fecha" : ISODate("2017-01-21T21:21:42.044Z")
}

}

Controller

   Continentes continentes = new Continentes();
   Optional<Continentes> c = continentesRepository.find(new Document("planetas.idplaneta", "marte"));
   if (c.isPresent()) {
      System.out.println("no existe");
   } else {
      continentes =c.get();
      System.out.println("" + continentes.toString());
   }

Salida:

Continentes{idcontinente=as, continente=Asia, planetas=Planetas{idplaneta=marte, planeta=Marte, fecha=Sat Jan 21 16:21:42 EST 2017}

Ejemplo 3: List @Embedded. Buscar en una lista de documentos embebidos

Deseamos buscar los documentos de continentes en el que este embebido el planeta marte en cualquiera de sus documentos embebidos.

db.continentes.find().pretty()                                                                                                    
{
    "_id" : ObjectId("5884f516b2a08a0ceb287e99"),
    "idcontinente" : "eu",
    "continente" : "Europa",
    "planetas" : [
            {
                    "idplaneta" : "marte",
                    "planeta" : "Marte",
                    "fecha" : ISODate("2017-01-21T21:21:42.044Z")
            },
            {
                    "idplaneta" : "tierra",
                    "planeta" : "Tierra",
                    "fecha" : ISODate("2017-01-21T21:21:42.044Z")
            }
    ]
 }
  {
    "_id" : ObjectId("5884f585b2a08a0da194491d"),
    "idcontinente" : "am",
    "continente" : "America",
    "planetas" : [
            {
                    "idplaneta" : "marte",
                    "planeta" : "Marte",
                    "fecha" : ISODate("2017-01-21T21:21:42.044Z")
            }
    ]
}

Entity

@Getter @Setter public class Continentes {

@Id
private String idcontinente;
private String continente;
@Embedded
private List planetas;

@Override
public String toString() {
    return "Continentes{" + "idcontinente=" + idcontinente + ", continente=" + continente + ", planetas=" + planetas + '}';
}
}

Controller

       Continentes continentes = new Continentes();
       Optional<Continentes> c = continentesRepository.find(new Document("planetas.idplaneta", "marte"));
       if (c.isPresent()) {
           System.out.println("no existe");
         } else {
          continentes =c.get();
          System.out.println("" + continentes.toString());
         }

Salida:

Mostraría los dos dos documentos America/Europa ya que tienen idplaneta = marte embebido.

Last updated