Temos a nossa disposição os operadores $all, $elemMatch e $size para facilitar a buscas em array no MongoDb.
Explicarei melhor com exemplos, logo em seguida.
Como estou fazendo o curso Be-mean, usarei o banco be-mean e a coleção pokemons para prosseguir com os exemplos. Então para uma melhor aprendizagem sugiro seguir esses passos abaixo:
- Importar o arquivo json aqui para o banco be-mean. Puts, mas eu não sei como vou fazer para importar esses arquivos para o meu mongodb. Segue esse vídeo em 2:03 minutos de video o professor William Bruno pode te ajudar, é lógico, se você estiver com o mongodb instalado. Caso ainda não instalou siga essa documentação para instalar em seu S.O.
Primeiramente iremos fazer uma consulta por tipo de dados.
###$types retorna os documentos de acordo com a especificação do tipo indicado.
Tipos disponíveis
Alterado na versão 3.2: o operador $type aceita aliases de String para os tipos BSON além dos números correspondentes aos tipos BSON. As versões anteriores só aceitou os números correspondentes ao tipo BSON.
| Type | Number | Alias | Notes |
|---|---|---|---|
| Double | 1 | “double” | |
| String | 2 | “string” | |
| Object | 3 | “object” | |
| Array | 4 | “array” | |
| Binary data | 5 | “binData” | |
| Undefined | 6 | “undefined” | Deprecated. |
| Object id | 7 | “objectId” | |
| Boolean | 8 | “bool” | |
| Date | 9 | “date” | |
| Null | 10 | “null” | |
| Regular Expression | 11 | “regex” | |
| DBPointer | 12 | “dbPointer” | |
| JavaScript | 13 | “javascript” | |
| Symbol | 14 | “symbol” | |
| JavaScript (with scope) | 15 | “javascriptWithScope” | |
| 32-bit integer | 16 | “int” | |
| Timestamp | 17 | “timestamp” | |
| 64-bit integer | 18 | “long” | |
| Min key | -1 | “minKey” | |
| Max key | 127 | “maxKey” |
$type suporta o número de alias, que irá corresponder contra os seguintes tipos BSON:
- duplo
- 32-bit inteiro
- 64-bit inteiro
Para mais informações, consulte a documentação aqui.
exemplo:
db.pokemons.find( {
_id: { $type : 7 }
} ).pretty();Retornamos todos os documentos, onde o _id é do tipo Object id.
Podemos retornar também todos os documentos onde o campo types é do tipo string ou um array com pelo menos um texto inserido.
exemplo:
db.pokemons.find( {
types: { $type : 2 }
} ).pretty();ou se você quer listar documentos em que o campo types é uma matriz, podemos usar o operador $were.
db.pokemons.find({
$where : "Array.isArray(this.types)"
} ).count();
###$all Retorna todos os documentos onde o valor de um campo é uma matriz que contém um ou todos os elementos especificados.
exemplo:
db.pokemons.find( {
types: { $all: [ "normal", "flying" ] }
} ).pretty()É retornado todos os documentos que possuem o types normal ou flying.
Os próximos exemplos iremos utilizar o banco restaurantes. Segue o link para copiar os documentos e importar no seu banco de dados mongodb. Siga os passos para a importação, conforme a orientação no começo desse post.
###$elemMatch Retorna os documentos que contêm um campo de matriz com pelo menos um elemento que coincide com todos os critérios de consulta especificadas.
exemplo:
db.restaurantes.find({
grades:{
$elemMatch:{
grade: "A",
score: {$gte: 23}
}
}
})É retornado todos os documentos que possuem os valores especificados no método find.
Poderiamos ter realizado essa simples consulta, talvez teriamos os mesmos resultado.
db.restaurantes.find({
grades:{
grade: "A",
score: {$gte: 23}
}
})Aí que você se engana. Nesse exemplo estamos dizendo o seguinte. Retornar todos os documentos onde a grade é "A" e score é maior que 23.
Não podemos esquecer que estamos fazendo uma busca em Array, nesse caso se apenas um elemento do array for diferente dos argumentos da query não teremos retorno.
O $elemMatch retorna os documentos, se no caso um elemento for verdadeiro, ou seja, se um elemento entre cinco satisfazer o nosso critério de busca, esse documento será retornado.
###$size Retorna todos os documentos na coleção, onde o número de elementos é especificados pelo argumento.
exemplo:
db.restaurantes.find( {
grades: { $size: 2 }
} ).pretty();Nesse caso, foi retornado todos os documentos da coleção, onde na grades possui dois elementos no array.
É isso aí e até a próxima!!!!
##Referências 1 - Documentação MongoDB