# 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.
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://avbravo-2.gitbook.io/jmoordb/capitulo-3/introduccion/busquedas-embedded.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
