# Shell

Se ha incluido el soporte para ejecutar instrucciones del shell de MongoDB directamente en Jmoordb.

| Método                                        | Descripción                                                                                                                            |
| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| List shell(String shell, Document... docSort) | shell: Es un String que representa instrucción MongoDB que se ejecuta en el shell. docSort es un documento que contiene la ordenación. |

Por ejemplo: Ejecutamos una consulta mediante $elemMatch&#x20;

referencia en MongoDB

<https://docs.mongodb.com/manual/reference/operator/query/elemMatch/>

en nuestro caso deseamos filtrar en una lista de documentos embebidos por dos o mas campos. Como recordara en una lista embebido en MongoDB (Array) , se aplica una condición Or, es decir busca en un documento dentro del array por un campo y si el otro valor del siguiente campo no esta en el mismo documento, continua buscando en otro documento por el segundo campo. De manera que para muchas condiciones and. no es factible utilizarlo , por esta razón podemos utilizar un $elemMatch para garantizar que se ejecuten las condiciones and en el mismo documento de una lista embebida.

La colección posee una lista embebida

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-MgRy1QNDJFmBPWJC-0-%2F-MgS-UQO23LflyYMzE4k%2Fddd.png?alt=media\&token=179a3b0f-d5cf-4382-8f11-2a2fb8daa21d)

documento de ejemplo

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-MgRy1QNDJFmBPWJC-0-%2F-MgS-FyVc1SD-_4qz8h5%2Fddd.png?alt=media\&token=3b72152b-5f50-4f9b-b65b-17cf503be85d)

Si usamos Robo3T. ejecutamos la consulta&#x20;

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-MgRy1QNDJFmBPWJC-0-%2F-MgS-jYgwDriSk0gDjXq%2Fccc.png?alt=media\&token=f1202aa3-9c18-4ada-9a53-05dc87891014)

Aplicamos el filtro para encontrar el usuario que contenga denttro de la lista embebida profile  docuemnto con la condicónl idapplicative = 3 idrole=12, iddepartament=3, active=false

```
   db.getCollection('user').find(
   { profile: { $elemMatch: {
                             idapplicative: { $eq: 3 },
                             idrole: { $eq:12 },
                             iddepartament:{$eq:3},
                             active:{$eq:false}
                                
                             } } }
    )
```

Contamos con las entidades&#x20;

User.java

```java
public class User {

    @Id
    private Integer iduser;
    private String username;
    private String password;
    private String name;
       @Email(message = "Email no es valido", regexp=".+@.+\\..+")
    private String email;
    private String cellphone;
    private String sex;
    private String photo;
    private String identificationcard;
    private String socialsecuritynumber;
    

    @Embedded
    private List<Profile> profile;

    private Boolean active;
```

Profile.java

```java
public class Profile {

    @Id
    private Integer idprofile;
    private Integer idapplicative;
    private Integer idrole;
    private Integer iddepartament;

    private Boolean active;
    @Ignore
    Applicative applicative;
    @Ignore
    Role role;
    @Ignore
    Departament departament;
    ..
    }
```

Para reducir el ejemplo omitiremos las clases Applicative, Role y Departament.

Contamos con un repository

```java

import com.avbravo.autentificacion.entity.User;
import com.avbravo.jmoordb.mongodb.repository.Repository;
import javax.ejb.Stateless;

/**
 *
 * @author avbravo
 */
@Stateless
public class UserRepository extends Repository<User> {

   
    public UserRepository(){
        super(User.class,"autentification","user");
    }
 

}
```

En el controller o clase que se desea utilizar

Desemos pasar el comando directamente como si lo hicieramos en el shell de mongodb

```java
{ profile: { $elemMatch: { idapplicative: { $eq:3  },idrole: { $eq:12 }, iddepartament:{$eq:3},active:{$eq:true } } } }
```

Con lo que debemos convertirlo a un String y luego invocar el metodo shell() del repository

```java

 @Inject
    UserRepository userRepository;
    
    
public List<User> queryElemMatch (@QueryParam("idapplicative") Integer idapplicative, @QueryParam("iddepartament") Integer iddepartament,
            @QueryParam("idrole") Integer idrole, @QueryParam("active") Boolean active) {
             List<User> userList = new ArrayList<>();
       if(idapplicative>0){
                shell+=operator+"idapplicative: { $eq:"+ idapplicative+"  }";
                operator=",";
                
            }
            if(iddepartament >0){
                shell+=operator+"iddepartament: { $eq:"+ iddepartament+"  }";
                operator=",";
            }
            if(idrole >0){
                shell+=operator+"idrole: { $eq:"+ idrole+"  }";
                operator=",";
            }
            shell+=operator+"active: { $eq:"+ active+"  }";
            
            shell +="} } }";
            
      userList = userRepository.shell(shell);                   
```

Esto nos devuelve la lista de usuario cuyos profiles cumplen con las condiciones.


---

# 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-4/introduccion-cap4/shell.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.
